Para desenhar um sublinhado abaixo de TextView no Android

Respostas:

323

Existem três maneiras de sublinhar o texto em TextView.

  1. SpannableString

  2. setPaintFlags (); de TextView

  3. Html.fromHtml ();

Deixe-me explicar todas as abordagens:

1ª abordagem

Para sublinhar o texto em TextView, você deve usar SpannableString

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

2ª abordagem

Você pode usar o método setPaintFlags de TextView para sublinhar o texto de TextView.

Por exemplo.

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

Você pode referir-se a constantes da classe Paint se quiser percorrer o texto.

3ª abordagem

Fazer uso de Html.fromHtml(htmlString);

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

OU

txtView.setText(Html.fromHtml("<u>underlined</u> text"));
Kartik Domadiya
fonte
1
Fico feliz em saber disso ... Marque esta questão como resolvida para que outros usuários possam encaminhá-la.
Kartik Domadiya de
4
Uma terceira abordagem seria usar Html.fromHtml("<u>This text will be underlined</u>"), mas tenho que admitir que sou um fã muito maior do uso de SpannableStrings. @Kartik: Você também pode usar um StrikethroughSpanno texto para criar o efeito tachado. :)
MH.
Amei a terceira abordagem. Curto, simples e conciso e adiciona apenas uma linha extra de código ao meu programa.
Matt
Eu sei que isso é meio antigo, mas há uma maneira de definir a espessura do sublinhado?
Andreas Wong
qual deles é usado para o conteúdo de preferênciaActivity, na PreferenceCategory?
desenvolvedor de Android de
40

apenas coloque o texto com a tag <u> no arquivo de recurso string.xml

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

e em sua atividade / fragmento

mTextView.setText(R.string.your_string);
Sarpe
fonte
7
@CHAKRAVARTHI não funcionará se você converter o texto para string antes de configurar. Por exemplo, textView.setText(getString(R.string.text)) <- errado . Certo: textView.setText(getText(R.string.text)) ou apenas textView.setText(R.string.text). A razão beind isso que getText()retorna Spannablecom vãos de sublinhado, mas se você usar getString()ele irá converter o Spannablepara Stringvãos resultantes sendo removido.
Yaroslav Mytkalyk
bom ponto!
Editei
19

Funciona para mim.

tv.setPaintFlags(Paint.UNDERLINE_TEXT_FLAG);
mani
fonte
11

Para quem ainda está olhando para esta questão. Isso é para um hiperlink, mas você pode modificá-lo para apenas um sublinhado:

Crie um 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>

Crie um novo estilo:

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

Em seguida, use este estilo em seu TextView:

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

Se seu TextView tem largura fixa, a solução alternativa pode ser criar uma View que se pareça com um sublinhado e posicioná-lo logo abaixo de seu 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>
Lera
fonte
2

Uma solução simples e sustentável é criar uma lista de camadas e torná-la o plano de fundo de seu 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
fonte
2
Esta é a melhor escolha se for um textview de uma linha
hushed_voice
0

sublinhar uma visualização de texto no android

5 maneiras incríveis de sublinhar um TextView no Android - Kotlin / Java e XML

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

Mas Html.fromHtml (recurso String) foi preterido na API 24.

Portanto, você pode usar a biblioteca de suporte do Android mais recente, androidx.core.text.HtmlCompat . Antes disso, você precisa incluir a dependência em seu projeto.

`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);`
Vijay Ram
fonte