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

#android #textview #underline

#Android #textview #подчеркивание

Вопрос:

Я хочу нарисовать подчеркивание под моим TextView . Я просмотрел несколько материалов, но не смог найти ничего полезного.

Может ли кто-нибудь, пожалуйста, помочь мне здесь?

Ответ №1:

Есть три способа подстроить текст в 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. Рад это слышать .. Отметьте этот вопрос как решенный, чтобы другие пользователи могли сослаться на него.

2. Третьим подходом было бы использование Html.fromHtml("<u>This text will be underlined</u>") , но я должен признать, что я гораздо больший поклонник использования SpannableStrings. @Kartik: Вы могли бы также использовать StrikethroughSpan в тексте для создания эффекта зачеркивания. 🙂

3. Нравится 3-й подход. Короткое, простое и лаконичное и добавляет всего одну дополнительную строку кода в мою программу.

4. Я знаю, что это довольно старое, но есть ли способ установить толщину подчеркивания?

5. какой из них используется для содержимого PreferenceActivity в категории PreferenceCategory ?

Ответ №2:

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

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

и в вашей активности / фрагменте

 mTextView.setText(R.string.your_string);
  

Комментарии:

1.@CHAKRAVARTHI это не сработает, если вы преобразуете текст в строку перед настройкой. Например. textView.setText(getString(R.string.text)) <- неправильно. Правильно: textView.setText(getText(R.string.text)) или просто textView.setText(R.string.text) . Причина в том, что это getText() возвращает Spannable с подчеркнутыми промежутками, но если вы используете getString() , это преобразует Spannable в String удаляемые промежутки.

2. хороший момент! Я отредактировал свой текущий ответ, чтобы быть более понятным

3. Спасибо, что поделились…. Очень удобный способ !

Ответ №3:

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

 tv.setPaintFlags(Paint.UNDERLINE_TEXT_FLAG);
  

Ответ №4:

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

Создайте чертеж (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"/>
  

Комментарии:

1. спасибо, это очень полезно, и я узнаю что-то новое, а атрибут top left etc, который мы можем использовать как верхнюю или боковую строку. еще раз спасибо

Ответ №5:

Простым и устойчивым решением является создание списка слоев и использование его в качестве фона вашего 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>
  

Комментарии:

1. Это лучший выбор, если это однострочный textview

Ответ №6:

Если ваш TextView имеет фиксированную ширину, альтернативным решением может быть создание представления, которое будет выглядеть как подчеркивание, и расположите его прямо под вашим 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>
  

Ответ №7:

подчеркивание textview в Android

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

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

Но Html.fromHtml(строковый ресурс) устарел в 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 amp;<u>Underline using HtmlCompat.fromHtml() and string resourceamp;</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);`
  

Ответ №8:

Вы можете использовать расширение Kotlin и ввести свой собственный drawUnderLine метод.

 fun TextView.drawUnderLine() {
    val text = SpannableString(this.text.toString())
    text.setSpan(UnderlineSpan(), 0, text.length, 0)
    this.text = text
}
  
 yourTextView.drawUnderLine()
  

Ответ №9:

В Kotlin вы можете создать свойство расширения:

 inline var TextView.underline: Boolean
    set(visible) {
        paintFlags = if (visible) paintFlags or Paint.UNDERLINE_TEXT_FLAG
        else paintFlags and Paint.UNDERLINE_TEXT_FLAG.inv()
    }
    get() = paintFlags and Paint.UNDERLINE_TEXT_FLAG == Paint.UNDERLINE_TEXT_FLAG
  

И используйте:

 textView.underline = true
  

Ответ №10:

Если вы хотите ввести текст адреса электронной почты под строкой и хотите открыть приложение, связанное с электронной почтой, когда пользователь нажимает на этот конкретный адрес электронной почты, тогда вот лучший способ. Просто используйте свойство below.

 android:autoLink="email"
  

Аналогично вы можете использовать для веб-сайта

 android:autoLink="web"
  

Кроме того, если вы хотите задать цвет текста, вы можете использовать свойство ниже

 android:textColorLink="@color/email_text_color"
  

Комментарии:

1. Я понятия не имел, что эта функция существует. Спасибо, жизнь безопаснее!