Cách vẽ gạch chân bên dưới TextView trong Android


Câu trả lời:


323

Có ba cách để gạch dưới văn bản trong TextView.

  1. SpannableString

  2. setPaintFlags (); của TextView

  3. Html.fromHtml ();

Hãy để tôi giải thích cho bạn tất cả các cách tiếp cận:

Cách tiếp cận đầu tiên

Để gạch dưới văn bản trong TextView, bạn phải sử dụng SpannableString

String udata="Underlined Text";
SpannableString content = new SpannableString(udata);
content.setSpan(new UnderlineSpan(), 0, udata.length(), 0);
mTextView.setText(content);

Cách tiếp cận thứ 2

Bạn có thể sử dụng phương thức setPaintFlags của TextView để gạch dưới văn bản của TextView.

Ví dụ.

mTextView.setPaintFlags(mTextView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
mTextView.setText("This text will be underlined");

Bạn có thể tham khảo các hằng số của lớp Paint nếu bạn muốn đánh ngang qua văn bản.

Cách tiếp cận thứ 3

Tận dụng Html.fromHtml(htmlString);

String htmlString="<u>This text will be underlined</u>";
mTextView.setText(Html.fromHtml(htmlString));

HOẶC LÀ

txtView.setText(Html.fromHtml("<u>underlined</u> text"));

1
Rất vui khi biết điều đó.. Đánh dấu câu hỏi này là đã được giải quyết để những người dùng khác có thể tham khảo.
Kartik Domadiya

4
Cách tiếp cận thứ ba sẽ được sử dụng Html.fromHtml("<u>This text will be underlined</u>"), nhưng tôi phải thừa nhận rằng tôi là một fan hâm mộ lớn hơn nhiều của việc sử dụng SpannableStrings. @Kartik: Bạn cũng có thể sử dụng một StrikethroughSpantrên văn bản để tạo hiệu ứng gạch ngang. :)
MH.

Yêu thích cách tiếp cận thứ 3. Ngắn gọn, đơn giản và súc tích và chỉ thêm một dòng mã bổ sung vào chương trình của tôi.
Matt

Tôi biết cái này hơi cũ, nhưng có cách nào để đặt độ dày của gạch dưới không?
Andreas Wong

cái nào trong số đó được sử dụng cho nội dung PreferencesActivity, trong PreferenceCategory?
nhà phát triển android

40

chỉ cần bao quanh văn bản của bạn bằng thẻ <u> trong tệp tài nguyên string.xml của bạn

<string name="your_string"><u>Underlined text</u></string>

và trong Hoạt động / Phân đoạn của bạn

mTextView.setText(R.string.your_string);

7
@CHAKRAVARTHI nó sẽ không hoạt động nếu bạn truyền văn bản thành chuỗi trước khi thiết lập. Vd: textView.setText(getString(R.string.text)) <- sai . Đúng: textView.setText(getText(R.string.text)) hoặc chỉ textView.setText(R.string.text). Lý do beind này mà getText()lợi nhuận Spannablevới nhịp gạch dưới, nhưng nếu bạn sử dụng getString()nó sẽ chuyển đổi Spannableđể Stringdẫn đến nhịp bị xóa.
Yaroslav Mytkalyk

điểm tốt! Tôi đã chỉnh sửa câu trả lời hiện tại của mình để rõ ràng hơn
Sarpe

19

Nó hoạt động cho tôi.

tv.setPaintFlags(Paint.UNDERLINE_TEXT_FLAG);

11

Đối với bất cứ ai vẫn nhìn vào câu hỏi này. Đây là một siêu liên kết nhưng bạn có thể sửa đổi nó chỉ với một gạch dưới đơn giản:

Tạo một drawable (hyperlink_underline.xml):

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

      <stroke android:width="2dp"
              android:color="#3498db"/>
    </shape>
  </item>
</layer-list>

Tạo một phong cách mới:

<style name="Hyperlink">
    <item name="android:textColor">#3498db</item>
    <item name="android:background">@drawable/hyperlink_underline</item>
  </style>

Sau đó, sử dụng kiểu này trên TextView của bạn:

<TextView
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    local:MvxBind="Text Id; Click ShowJobInfoCommand"
    style="@style/HyperLink"/>

3

Nếu TextView của bạn có chiều rộng cố định, giải pháp thay thế có thể là tạo một View trông giống như một gạch dưới và đặt nó ngay bên dưới TextView của bạn.

<RelativeLayout
   android:layout_width="match_parent"
   android:layout_height="match_parent">

        <TextView
            android:id="@+id/myTextView"
            android:layout_width="20dp"
            android:layout_height="wrap_content"/>

        <View
            android:layout_width="20dp"
            android:layout_height="1dp"
            android:layout_below="@+id/myTextView"
            android:background="#CCCCCC"/>
</RelativeLayout>

2

Một giải pháp đơn giản và bền vững là tạo danh sách lớp và đặt nó làm nền cho TextView của bạn:

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

2
Đây là lựa chọn tốt nhất nếu nó là một đơn dòng TextView
hushed_voice

0

gạch dưới một textview trong android

5 cách tuyệt vời để gạch dưới một TextView trong Android - Kotlin / Java & XML

  1. String html = "<u>Underline using Html.fromHtml()</u>"; textview.setText(Html.fromHtml(html));

Nhưng Html.fromHtml (Tài nguyên chuỗi) không được chấp nhận trong API 24.

Vì vậy, bạn có thể sử dụng thư viện hỗ trợ android mới nhất androidx.core.text.HtmlCompat . Trước đó, bạn cần đưa sự phụ thuộc vào dự án của mình.

`implementation 'androidx.core:core:1.0.1'`
  1. String html = "<u> 1.1 Underline using HtmlCompat.fromHtml()</u>"; //underline textview using HtmlCompat.fromHtml() method textview11.setText(HtmlCompat.fromHtml(html, HtmlCompat.FROM_HTML_MODE_LEGACY));

Sử dụng string.xml ,

  1. <string name="underline_text">1.3 &lt;u>Underline using HtmlCompat.fromHtml() and string resource&lt;/u></string>

textview13.setText(HtmlCompat.fromHtml(getString(R.string.underline_text), HtmlCompat.FROM_HTML_MODE_LEGACY));

sử dụng PaintFlags

  1. textview2.setPaintFlags(textview2.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG); textview2.setText("2. Underline using setPaintFlags()");

sử dụng SpannableString

`String content1 = "3.1 Underline using SpannableString";
        SpannableString spannableString1 = new SpannableString(content1);
        spannableString1.setSpan(new UnderlineSpan(), 0, content1.length(), 0);
        textview31.setText(spannableString1);`
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.