Tôi có thể gạch chân văn bản trong bố cục Android không?


Câu trả lời:


1143

Nó có thể đạt được nếu bạn đang sử dụng tệp xml tài nguyên chuỗi , hỗ trợ các thẻ HTML như <b></b>, <i></i><u></u>.

<resources>
    <string name="your_string_here">This is an <u>underline</u>.</string>
</resources>

Nếu bạn muốn gạch chân một cái gì đó từ mã sử dụng:

TextView textView = (TextView) view.findViewById(R.id.textview);
SpannableString content = new SpannableString("Content");
content.setSpan(new UnderlineSpan(), 0, content.length(), 0);
textView.setText(content);

49
Xin chào, tôi đã thử mã xml tài nguyên ở trên và nó không hoạt động. nó tiếp tục hiển thị <u> gạch chân </ u> dưới dạng văn bản thuần túy
Jonathan

4
Xem thêm: android.text.Html.fromHtml () sẽ trả về một Spned.
Đánh dấu Renouf

3
Bạn nên nhập nó vào tệp tin String.xml, không thực hiện bằng nút thêm. Nếu không, bạn sẽ nhận được điều này & lt; u & gt; trong tệp String.xml của bạn và <u> gạch chân </ u> trong mã của bạn
gdrt

3
Tôi đã gặp các trường hợp khi cơ bản thông qua <u>các thẻ không hoạt động, ví dụ đôi khi nếu bạn đang sử dụng một phông chữ tùy chỉnh. Tuy nhiên, cơ bản về mặt lập trình bởi UnderlineSpanvẫn chưa thất bại với tôi, vì vậy tôi muốn giới thiệu nó như là giải pháp đáng tin cậy nhất.
Giulio Piancastelli

26
Nó sẽ không hiển thị trong trình chỉnh sửa, nhưng khi bạn khởi động ứng dụng You - nó sẽ được gạch chân.
jean d'arme

533

Bạn có thể thử với

textview.setPaintFlags(textview.getPaintFlags() |   Paint.UNDERLINE_TEXT_FLAG);

1
Có thể là một điểm nhỏ, nhưng OP muốn điều này được xác định trong tệp bố cục XML; mặt khác, đây là một giải pháp tuyệt vời
kwishnu

4
sử dụng giải pháp này nếu bạn muốn xóa nó
Bobs

2
giải pháp này cũng có thể được sử dụng cho Nút
Rudy Kurniawan

3
Cẩn thận nếu bạn sử dụng phông chữ tùy chỉnh hoặc tương tự, bạn cũng có thể cần | Paint.ANTI_ALIAS_FLAGhoặc văn bản của bạn sẽ trông rất sắc nét. Điều này biểu hiện trong các API thấp hơn thường xuyên hơn không.
Martin Marconcini

4
Tại Kotlin:textView.paintFlags = textView.paintFlags or Paint.UNDERLINE_TEXT_FLAG
Albert Vila Calvo

72

Câu trả lời "được chấp nhận" ở trên KHÔNG hoạt động (khi bạn cố gắng sử dụng chuỗi như thế nào textView.setText(Html.fromHtml(String.format(getString(...), ...))).

Như đã nêu trong tài liệu, bạn phải thoát (mở mã thực thể html) của các thẻ bên trong &lt;, ví dụ: kết quả sẽ như sau:

<resource>
    <string name="your_string_here">This is an &lt;u&gt;underline&lt;/u&gt;.</string>
</resources>

Sau đó, trong mã của bạn, bạn có thể đặt văn bản với:

TextView textView = (TextView) view.findViewById(R.id.textview);
textView.setText(Html.fromHtml(String.format(getString(R.string.my_string), ...)));

4
<u> được gạch chân ở đây </ u> hoạt động hoàn hảo. & lt; u> gạch chân & lt; / u> không hoạt động. Đây là dành cho Android 2.2. Có thể các phiên bản khác nhau giải thích nó khác nhau.
dùng898763452

@autotravis cái nào dành cho 2.2? Tôi đã không thử nghiệm nó trên các phiên bản cũ hơn và sẽ khá đáng tiếc nếu các phiên bản khác nhau xử lý nó khác nhau ... Ngoài ra, ít nhất là tài liệu hiện tại nói rằng nó phải được thoát (liên kết nằm trong câu trả lời).
Ognyan

Tôi đã thử nghiệm <u> gạch chân </ u> trên Android 2.3 và nó hoạt động. & lt; u> gạch chân & lt; / u> không hoạt động trong 2.3. Các tài liệu nói "Đôi khi bạn có thể muốn tạo tài nguyên văn bản theo kiểu cũng được sử dụng làm chuỗi định dạng. Thông thường, điều này sẽ không hoạt động vì phương thức String.format (String, Object ...) sẽ loại bỏ tất cả thông tin kiểu. từ chuỗi. Cách giải quyết vấn đề này là viết các thẻ HTML với các thực thể thoát, sau đó được phục hồi bằng fromHtml (Chuỗi), sau khi quá trình định dạng diễn ra. " Vì vậy, tôi đoán bạn sẽ sử dụng lối thoát nếu bạn chạy nó thông qua phương thức String.format (...) đó.
dùng898763452

@autotravis vâng, bạn đúng rồi. Tôi sử dụng nó với String.format (...). Tôi đã chỉnh sửa câu trả lời của tôi, cảm ơn bạn đã phản hồi.
Ognyan

Trên 2.3 và 4.1 (chỉ những cái tôi đã thử cho đến nay), bạn chỉ có thể sử dụng textView.setText (getText (R.opes.text)) thay vì phải sử dụng getString (), Html.fromHtml () và String.format ().
Roy Solberg

59

Nội dung tệp String.xml:

<resource>
     <string name="my_text">This is an <u>underline</u>.</string> 
</resources> 

Bố cục tệp xml sẽ sử dụng tài nguyên chuỗi ở trên với các thuộc tính bên dưới của textview, như được hiển thị bên dưới:

<TextView 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal"
    android:text="@string/my_text"

    android:selectAllOnFocus="false"
    android:linksClickable="false"
    android:autoLink="all"
    />

3
Hãy chắc chắn rằng bạn chỉnh sửa tệp tài nguyên chuỗi bên trong XML thực tế chứ không phải bên trong UI chỉnh sửa trình trợ giúp trong Eclipse, vì nó sẽ thoát khỏi <s.
Chris Rae

51

Đối với Nút và TextView, đây là cách dễ nhất:

Cái nút:

Button button = (Button) findViewById(R.id.btton1);
button.setPaintFlags(button.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);

Xem văn bản:

TextView textView = (TextView) findViewById(R.id.textview1);
textView.setPaintFlags(textView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);

Giải pháp rất thanh lịch. Cảm ơn bạn!
Adrian

20

Giải pháp một dòng

myTextView.setText(Html.fromHtml("<p><u>I am Underlined text</u></p>"));

Nó hơi muộn nhưng có thể hữu ích cho ai đó.


19

Trong chức năng mở rộng Kotlin có thể được sử dụng. Điều này chỉ có thể được sử dụng từ mã, không phải xml.

fun TextView.underline() {
    paintFlags = paintFlags or Paint.UNDERLINE_TEXT_FLAG
}

Sử dụng:

 tv_change_number.underline()
 tv_resend_otp.underline()

13

kiểm tra kiểu nút có thể nhấp được nhấn mạnh:

<TextView
    android:id="@+id/btn_some_name"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/btn_add_contact"
    android:textAllCaps="false"
    android:textColor="#57a0d4"
    style="@style/Widget.AppCompat.Button.Borderless.Colored" />

chuỗi XML:

<string name="btn_add_contact"><u>Add new contact</u></string>

Kết quả:

nhập mô tả hình ảnh ở đây


Giao diện của Widget.AppCompat.Button.Borderless.Colored tốt hơn nhiều so với gạch chân, tuy nhiên, như @Kiril Vashilo mô tả, bạn vẫn có thể làm điều đó.
xarlymg89

11

Cách tiếp cận gần đây nhất của việc vẽ văn bản được gạch chân được mô tả bởi Romain Guy trên phương tiện với mã nguồn có sẵn trên GitHub . Ứng dụng mẫu này cho thấy hai triển khai có thể:

  • Việc triển khai dựa trên đường dẫn yêu cầu API cấp 19
  • Việc triển khai dựa trên khu vực yêu cầu API cấp 1

nhập mô tả hình ảnh ở đây


10

Tôi biết đây là một câu trả lời muộn, nhưng tôi đã đưa ra một giải pháp hoạt động khá tốt ... Tôi đã lấy câu trả lời từ Anthony Forloney để gạch chân văn bản trong mã và tạo một lớp con TextView xử lý nó cho bạn. Sau đó, bạn chỉ có thể sử dụng lớp con trong XML bất cứ khi nào bạn muốn có TextView được gạch chân.

Đây là lớp tôi đã tạo:

import android.content.Context;
import android.text.Editable;
import android.text.SpannableString;
import android.text.TextWatcher;
import android.text.style.UnderlineSpan;
import android.util.AttributeSet;
import android.widget.TextView;

/**
 * Created with IntelliJ IDEA.
 * User: Justin
 * Date: 9/11/13
 * Time: 1:10 AM
 */
public class UnderlineTextView extends TextView
{
    private boolean m_modifyingText = false;

    public UnderlineTextView(Context context)
    {
        super(context);
        init();
    }

    public UnderlineTextView(Context context, AttributeSet attrs)
    {
        super(context, attrs);
        init();
    }

    public UnderlineTextView(Context context, AttributeSet attrs, int defStyle)
    {
        super(context, attrs, defStyle);
        init();
    }

    private void init()
    {
        addTextChangedListener(new TextWatcher()
        {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after)
            {
                //Do nothing here... we don't care
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count)
            {
                //Do nothing here... we don't care
            }

            @Override
            public void afterTextChanged(Editable s)
            {
                if (m_modifyingText)
                    return;

                underlineText();
            }
        });

        underlineText();
    }

    private void underlineText()
    {
        if (m_modifyingText)
            return;

        m_modifyingText = true;

        SpannableString content = new SpannableString(getText());
        content.setSpan(new UnderlineSpan(), 0, content.length(), 0);
        setText(content);

        m_modifyingText = false;
    }
}

Bây giờ ... bất cứ khi nào bạn muốn tạo một textview được gạch chân trong XML, bạn chỉ cần làm như sau:

<com.your.package.name.UnderlineTextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:gravity="center"
    android:text="This text is underlined"
    android:textColor="@color/blue_light"
    android:textSize="12sp"
    android:textStyle="italic"/>

Tôi đã thêm các tùy chọn bổ sung trong đoạn mã XML này để cho thấy ví dụ của tôi hoạt động với việc thay đổi màu văn bản, kích thước và kiểu ...

Hi vọng điêu nay co ich!


2
Trong khi ví dụ này hoạt động, tôi nhanh chóng nhận ra rằng nếu bạn muốn có thêm quyền kiểm soát trong XML thì điều này sẽ không xảy ra ... Tôi đã chuyển sang một giải pháp tốt hơn bao gồm các bước sau: 1) Văn bản lớp con 2) Thêm hỗ trợ để gạch chân văn bản thông qua các thuộc tính tùy chỉnh để thực hiện gạch chân như được chỉ định ở trên. Sự khác biệt duy nhất là bạn chỉ thực thi mã gạch dưới nếu thuộc tính tùy chỉnh được đặt.
Justin

10

Một cách sạch hơn thay vì
textView.setPaintFlags(textView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG); phương pháp là sử dụng textView.getPaint().setUnderlineText(true);

Và nếu sau này bạn cần tắt gạch chân cho chế độ xem đó, chẳng hạn như trong chế độ xem được sử dụng lại trong RecyclerView, textView.getPaint().setUnderlineText(false);


7

Chỉ cần sử dụng thuộc tính trong tệp tài nguyên chuỗi, vd

<string name="example"><u>Example</u></string>

7

Tôi đã sử dụng xml drawable này để tạo đường viền dưới cùng và áp dụng drawable làm nền cho textview của tôi

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="rectangle" >
            <solid android:color="@android:color/transparent" />
        </shape>
    </item>

    <item android:top="-5dp" android:right="-5dp" android:left="-5dp">
        <shape>
            <solid android:color="@android:color/transparent" />
            <stroke
                    android:width="1.5dp"
                    android:color="@color/pure_white" />
        </shape>
    </item>
</layer-list>

đây là giải pháp hoàn hảo cho tất cả các gạch chân xem với màu tùy chỉnh. đừng coi thường nền trong suốt ở đây, đối với Android 4 thì bắt buộc, chế độ xem của bạn sẽ có nền đen với nó
Ivan Mitsura

5

Một giải pháp đơn giản và linh hoạt trong xml:

<View
  android:layout_width="match_parent"
  android:layout_height="3sp"
  android:layout_alignLeft="@+id/your_text_view_need_underline"
  android:layout_alignRight="@+id/your_text_view_need_underline"
  android:layout_below="@+id/your_text_view_need_underline"
  android:background="@color/your_color" />

4

một giải pháp khác là tạo chế độ xem tùy chỉnh mở rộng TextView như hiển thị bên dưới

public class UnderLineTextView extends TextView {

    public UnderLineTextView(Context context) {
        super(context);
        this.setPaintFlags(Paint.UNDERLINE_TEXT_FLAG);
    }

    public UnderLineTextView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        this.setPaintFlags(Paint.UNDERLINE_TEXT_FLAG);
    }

}

và chỉ cần thêm vào xml như hình dưới đây

<yourpackage.UnderLineTextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="underline text"
 />

Tuyệt vời!! Nhưng màu của gạch chân là màu xám làm thế nào để thay đổi nó thành màu đen hoặc bất kỳ màu nào khác?
OhhhThatVarun

3

Tôi đã đơn giản hóa câu trả lời của Samuel :

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <!--https://stackoverflow.com/a/40706098/4726718-->
    <item
        android:left="-5dp"
        android:right="-5dp"
        android:top="-5dp">
        <shape>
            <stroke
                android:width="1.5dp"
                android:color="@color/colorAccent" />
        </shape>
    </item>
</layer-list>

3

Tôi đã tạo ra phương pháp này cho dễ dàng

TextView tv = findViewById(R.id.tv);
tv.setText("some text");

Gạch chân toàn bộ TextView

setUnderLineText(tv, tv.getText().toString());

Gạch chân một số phần của TextView

setUnderLineText(tv, "some");

Cũng hỗ trợ các con TextView như EditText, Nút, Hộp kiểm

public void setUnderLineText(TextView tv, String textToUnderLine) {
        String tvt = tv.getText().toString();
        int ofe = tvt.indexOf(textToUnderLine, 0);

        UnderlineSpan underlineSpan = new UnderlineSpan();
        SpannableString wordToSpan = new SpannableString(tv.getText());
        for (int ofs = 0; ofs < tvt.length() && ofe != -1; ofs = ofe + 1) {
            ofe = tvt.indexOf(textToUnderLine, ofs);
            if (ofe == -1)
                break;
            else {
                wordToSpan.setSpan(underlineSpan, ofe, ofe + textToUnderLine.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                tv.setText(wordToSpan, TextView.BufferType.SPANNABLE);
            }
        }
    }

kiểm tra câu trả lời của tôi ở đây để làm cho văn bản gạch chân có thể nhấp hoặc gạch chân nhiều phần của TextView


2

thử mã này

trong XML

<resource>
 <string name="my_text"><![CDATA[This is an <u>underline</u>]]></string> 
</resources> 

trong mã

TextView textView = (TextView) view.findViewById(R.id.textview);
textView.setText(Html.fromHtml(getString(R.string.my_text)));

Chúc may mắn!


2
  1. Chuyển đến tệp tài nguyên String.xml
  2. Thêm một chuỗi trong tệp tài nguyên với thẻ gạch chân HTML khi cần thiết.

mẫu gạch chân HTML

  1. Gọi ID tài nguyên chuỗi trong mã Java của bạn như sau:
sampleTextView.setText(R.string.sample_string);
  1. Đầu ra phải có chữ "Stackoverflow" được gạch chân.

Hơn nữa, đoạn mã sau sẽ không in phần gạch chân:

String sampleString = getString(R.string.sample_string);
sampleTextView.setText(sampleString);

Thay vào đó, sử dụng mã sau để giữ lại định dạng văn bản phong phú:

CharSequence sampleString = getText(R.string.sample_string);
sampleTextView.setText(sampleString);

"Bạn có thể sử dụng getString (int) hoặc getText (int) để truy xuất chuỗi. GetText (int) giữ lại bất kỳ kiểu văn bản có định dạng nào được áp dụng cho chuỗi." Tài liệu Android.

Tham khảo tài liệu: https://developer.android.com/guide/topics/resource/opes-resource.html

Tôi hi vọng cái này giúp được.


2

Câu trả lời được bình chọn hàng đầu là đúng và đơn giản nhất. Tuy nhiên, đôi khi bạn có thể thấy rằng không hoạt động đối với một số phông chữ, nhưng làm việc cho những người khác. (Vấn đề mà tôi vừa gặp phải khi giao tiếp với tiếng Trung Quốc.)

Giải pháp không chỉ sử dụng "WRAP_CONTENT" cho TextView của bạn, vì không có thêm không gian để vẽ đường. Bạn có thể đặt chiều cao cố định cho TextView của mình hoặc sử dụng android: paddingV vertical với WRAP_CONTENT.


1
HtmlCompat.fromHtml(
                    String.format(context.getString(R.string.set_target_with_underline)),
                    HtmlCompat.FROM_HTML_MODE_LEGACY)
<string name="set_target_with_underline">&lt;u>Set Target&lt;u> </string>

Lưu ý biểu tượng Escape trong tệp xml


làm việc cho tôi với các ký hiệu thoát, Cảm ơn!
Badr Vào

1

Để làm điều đó trong Kotlin:

yourTextView.paint?.isUnderlineText = true


0

Sẽ khá muộn để trả lời điều này nhưng giả sử nếu bất cứ ai muốn lấy văn bản một cách linh hoạt thì họ có thể sử dụng một dòng đơn giản này trong mã java của họ hoạt động:

 textView.setText(Html.fromHtml("<p><u>" + get_name + "</u></p>"));

-2

Tôi gặp vấn đề khi tôi sử dụng phông chữ tùy chỉnh và phần gạch chân được tạo bằng thủ thuật tệp tài nguyên ( <u>Underlined text</u>) đã hoạt động nhưng Android đã quản lý để chuyển đổi phần gạch chân thành một loại máng đình công.

Tôi đã sử dụng câu trả lời này để tự vẽ một đường viền bên dưới textview: https://stackoverflow.com/a/10732993/664449 . Rõ ràng điều này không hoạt động đối với văn bản được gạch chân một phần hoặc văn bản đa lớp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.