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.