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.