Чтобы нарисовать подчеркивание под TextView в Android

Ответы:

323

В TextView есть три способа выделить текст в нижнюю часть.

  1. SpannableString

  2. setPaintFlags (); TextView

  3. Html.fromHtml ();

Позвольте мне объяснить вам все подходы:

1-й подход

Для подчеркивания текста в TextView вы должны использовать SpannableString

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

2-й подход

Вы можете использовать метод setPaintFlags TextView, чтобы подчеркнуть текст TextView.

Например,

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

Вы можете ссылаться на константы класса Paint, если хотите пробиться сквозь текст.

3-й подход

Использовать Html.fromHtml(htmlString);

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

ИЛИ

txtView.setText(Html.fromHtml("<u>underlined</u> text"));
Картик Домадия
источник
1
Рад это слышать .. Отметьте этот вопрос как решенный, чтобы другие пользователи могли на него обратиться.
Kartik Domadiya
4
Можно было бы использовать третий подход Html.fromHtml("<u>This text will be underlined</u>"), но я должен признать, что я гораздо больший поклонник использования SpannableStrings. @Kartik: Вы также можете использовать a StrikethroughSpanв тексте, чтобы создать эффект зачеркивания. :)
МЗ.
Люблю 3-й подход. Короткий, простой и лаконичный, добавляющий в мою программу всего одну дополнительную строку кода.
Мэтт
Я знаю, что это старовато, но есть ли способ установить толщину подчеркивания?
Андреас Вонг
какой из них используется для содержимого preferenceActivity в PreferenceCategory?
разработчик Android
40

просто окружите свой текст тегом <u> в файле ресурсов string.xml

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

и в вашей деятельности / фрагменте

mTextView.setText(R.string.your_string);
Sarpe
источник
7
@CHAKRAVARTHI это не сработает, если вы передадите текст в строку перед настройкой. Напр. textView.setText(getString(R.string.text)) <- неправильно . Правильно: textView.setText(getText(R.string.text)) или просто textView.setText(R.string.text). Причина beind это , что getText()возвращается Spannableс подчеркиванием пролетов, но если вы используете getString()это будет конвертировать Spannableв Stringрезультате пролетов удаляются.
Ярослав Мыткалык
хорошая точка зрения! Я отредактировал свой текущий ответ, чтобы быть более ясным
Сарпе
19

Это работает для меня.

tv.setPaintFlags(Paint.UNDERLINE_TEXT_FLAG);
мани
источник
11

Для тех, кто все еще просматривает этот вопрос. Это для гиперссылки, но вы можете изменить ее для простого подчеркивания:

Создайте файл для рисования (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>

Создайте новый стиль:

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

Затем используйте этот стиль в своем TextView:

<TextView
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    local:MvxBind="Text Id; Click ShowJobInfoCommand"
    style="@style/HyperLink"/>
Даниил
источник
3

Если ваш TextView имеет фиксированную ширину, альтернативным решением может быть создание View, которое будет выглядеть как подчеркивание, и расположить его прямо под вашим TextView.

<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

Простое и надежное решение - создать список слоев и сделать его фоном для TextView:

<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>
Darush
источник
2
Это лучший выбор, если это однострочный текстовый просмотр
hushed_voice
0

подчеркнуть текстовое изображение в android

5 удивительных способов подчеркнуть текстовое поле в Android - Kotlin / Java и XML

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

Но Html.fromHtml (ресурс String) устарел в API 24.

Таким образом, вы можете использовать последнюю версию библиотеки поддержки Android androidx.core.text.HtmlCompat . Перед этим вам нужно включить зависимость в свой проект.

`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));

Используя strings.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));

используя PaintFlags

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

с использованием SpannableString

`String content1 = "3.1 Underline using SpannableString";
        SpannableString spannableString1 = new SpannableString(content1);
        spannableString1.setSpan(new UnderlineSpan(), 0, content1.length(), 0);
        textview31.setText(spannableString1);`
Виджай Рам
источник