Para dibujar un subrayado debajo de TextView en Android


Respuestas:


323

Hay tres formas de subrayar el texto en TextView.

  1. SpannableString

  2. setPaintFlags (); de TextView

  3. Html.fromHtml ();

Déjame explicarte todos los enfoques:

1er Enfoque

Para subrayar el texto en TextView, debe usar SpannableString

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

2do enfoque

Puede hacer uso del método setPaintFlags de TextView para subrayar el texto de TextView.

Por ej.

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

Puede consultar las constantes de la clase Paint si desea tachar el texto.

3er Enfoque

Hacer uso de Html.fromHtml(htmlString);

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

O

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

1
Me alegra escuchar eso ... Marque esta pregunta como resuelta para que otros usuarios puedan referirla.
Kartik Domadiya

4
Un tercer enfoque sería el uso Html.fromHtml("<u>This text will be underlined</u>"), pero debo admitir que soy un fan mucho más grande del uso de SpannableStrings. @Kartik: También puede usar un StrikethroughSpanen el texto para crear el efecto de tachado. :)
MH.

Me encanta el tercer enfoque. Corto, simple y conciso y agrega solo una línea adicional de código a mi programa.
Matt

Sé que esto es un poco antiguo, pero ¿hay alguna manera de establecer el grosor del subrayado?
Andreas Wong

¿Cuál de los que se utiliza para el contenido de la actividad de preferencia, en la categoría de preferencia?
desarrollador de Android

40

simplemente rodee su texto con la etiqueta <u> en su archivo de recursos string.xml

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

y en tu Actividad / Fragmento

mTextView.setText(R.string.your_string);

7
@CHAKRAVARTHI no funcionará si lanza el texto a una cadena antes de configurarlo. Por ejemplo textView.setText(getString(R.string.text)) <- incorrecto . Correcto: textView.setText(getText(R.string.text)) o simplemente textView.setText(R.string.text). La razón detrás de esto es que getText()regresa Spannablecon tramos subrayados, pero si lo usa getString(), convertirá el Spannableen Stringtramos resultantes que se eliminarán.
Yaroslav Mytkalyk

¡buen punto! Edité mi respuesta actual para ser más clara
Sarpe

19

Funciona para mí.

tv.setPaintFlags(Paint.UNDERLINE_TEXT_FLAG);

11

Para cualquiera que todavía esté mirando esta pregunta. Esto es para un hipervínculo, pero puede modificarlo solo para un subrayado simple:

Cree un elemento dibujable (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>

Crea un nuevo estilo:

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

Luego use este estilo en su TextView:

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

3

Si su TextView tiene un ancho fijo, la solución alternativa puede ser crear una Vista que se verá como un subrayado y colocarla justo debajo de su 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

Una solución simple y sostenible es crear una lista de capas y convertirla en el fondo de su 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>

2
Esta es la mejor opción si se trata de una vista de texto de una sola línea
hushed_voice

0

subrayar una vista de texto en Android

5 formas asombrosas de subrayar un TextView en Android: Kotlin / Java y XML

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

Pero Html.fromHtml (recurso String) quedó obsoleto en API 24.

Para que pueda usar la última biblioteca de soporte de Android androidx.core.text.HtmlCompat . Antes de eso, debe incluir la dependencia en su proyecto.

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

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

usando PaintFlags

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

usando SpannableString

`String content1 = "3.1 Underline using SpannableString";
        SpannableString spannableString1 = new SpannableString(content1);
        spannableString1.setSpan(new UnderlineSpan(), 0, content1.length(), 0);
        textview31.setText(spannableString1);`
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.