Per disegnare una sottolineatura sotto TextView in Android


Risposte:


323

Esistono tre modi per sottolineare il testo in TextView.

  1. SpannableString

  2. setPaintFlags (); di TextView

  3. Html.fromHtml ();

Lascia che ti spieghi tutti gli approcci:

1 ° approccio

Per sottolineare il testo in TextView devi usare SpannableString

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

2 ° approccio

È possibile utilizzare il metodo setPaintFlags di TextView per sottolineare il testo di TextView.

Per es.

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

Puoi fare riferimento alle costanti della classe Paint se vuoi battere il testo.

3 ° approccio

Utilizzare 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
Sono contento di sentirlo ... Contrassegna questa domanda come risolta in modo che altri utenti possano segnalarla.
Kartik Domadiya

4
Un terzo approccio potrebbe essere utilizzato Html.fromHtml("<u>This text will be underlined</u>"), ma devo ammettere che sono un fan molto più grande dell'utilizzo di SpannableStrings. @ Kartik: Potresti anche usare un StrikethroughSpansul testo per creare l'effetto barrato. :)
MH.

Adoro il terzo approccio. Breve, semplice e conciso e aggiunge solo una riga di codice in più al mio programma.
Matt

So che è un po 'vecchio, ma c'è un modo per impostare lo spessore della sottolineatura?
Andreas Wong

quale di questi viene utilizzato per il contenuto preferenzaAttività, nella categoriaPreferenceCategory?
sviluppatore Android

40

racchiudi il tuo testo con il tag <u> nel tuo file di risorse string.xml

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

e nella tua attività / frammento

mTextView.setText(R.string.your_string);

7
@CHAKRAVARTHI non funzionerà se esegui il cast del testo su una stringa prima dell'impostazione. Ad esempio textView.setText(getString(R.string.text)) <- sbagliato . Giusto: textView.setText(getText(R.string.text)) o solo textView.setText(R.string.text). La ragione per questo beind che getText()torna Spannablecon campate di sottolineatura, ma se si utilizza getString()lo convertirà la Spannablea Stringcampate risultanti in corso di rimozione.
Yaroslav Mytkalyk

buon punto! Ho modificato la mia risposta attuale per essere più chiaro
Sarpe

19

Per me funziona.

tv.setPaintFlags(Paint.UNDERLINE_TEXT_FLAG);

11

Per chiunque stia ancora guardando questa domanda. Questo è per un collegamento ipertestuale ma puoi modificarlo solo per una semplice sottolineatura:

Crea un disegnabile (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 nuovo stile:

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

Quindi usa questo stile sul tuo TextView:

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

3

Se il tuo TextView ha una larghezza fissa, una soluzione alternativa può essere quella di creare una vista che assomigli a una sottolineatura e posizionarlo proprio sotto il tuo 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 soluzione semplice e sostenibile è creare un elenco di livelli e impostarlo come sfondo del tuo 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
Questa è la scelta migliore se si tratta di una visualizzazione di testo a riga singola
hushed_voice

0

sottolinea una visualizzazione di testo in Android

5 modi sorprendenti per sottolineare una visualizzazione di testo in Android - Kotlin / Java e XML

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

Ma Html.fromHtml (risorsa stringa) è stato deprecato nell'API 24.

Quindi puoi utilizzare l'ultima libreria di supporto Android androidx.core.text.HtmlCompat . Prima di ciò, devi includere la dipendenza nel tuo progetto.

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

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

utilizzando PaintFlags

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

utilizzando SpannableString

`String content1 = "3.1 Underline using SpannableString";
        SpannableString spannableString1 = new SpannableString(content1);
        spannableString1.setSpan(new UnderlineSpan(), 0, content1.length(), 0);
        textview31.setText(spannableString1);`
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.