Posso sottolineare il testo in un layout Android?


Risposte:


1144

Si può essere raggiunto se si utilizza un risorsa di tipo stringa file XML, che supporta HTML tag come <b></b>, <i></i>e <u></u>.

<resources>
    <string name="your_string_here">This is an <u>underline</u>.</string>
</resources>

Se vuoi sottolineare qualcosa dall'uso del codice:

TextView textView = (TextView) view.findViewById(R.id.textview);
SpannableString content = new SpannableString("Content");
content.setSpan(new UnderlineSpan(), 0, content.length(), 0);
textView.setText(content);

50
Ciao, ho provato il codice xml delle risorse sopra e non ha funzionato. ha continuato a mostrare la <u> sottolineatura </u> come un semplice testo
Jonathan,

4
Vedi anche: android.text.Html.fromHtml () che restituisce uno Spanning.
Mark Renouf,

3
Dovresti digitarlo nel file strings.xml stesso, non farlo con il pulsante Aggiungi. Altrimenti otterrai questo & lt; u & gt; nel tuo file strings.xml e <u> sottolinea </u> nel tuo codice
gdrt

3
Mi sono imbattuto in casi in cui i <u>tag sottostanti non funzionano, ad esempio a volte se si utilizza un carattere personalizzato. Tuttavia, a livello di programmazione da parte di UnderlineSpandeve ancora fallire su di me, quindi lo consiglierei come la soluzione più affidabile.
Giulio Piancastelli,

26
Non verrà visualizzato nell'editor, ma quando si avvia l'app, verrà sottolineato.
Jean d'arme,

534

Puoi provare con

textview.setPaintFlags(textview.getPaintFlags() |   Paint.UNDERLINE_TEXT_FLAG);

1
Forse un punto minore, ma OP voleva che questo fosse definito nel file di layout XML; altrimenti, questa è un'ottima soluzione.
kwishnu,

4
usa questa soluzione se vuoi cancellarla
Bob

2
questa soluzione può essere utilizzata anche per un pulsante
Rudy Kurniawan

3
Attento se si utilizzano caratteri personalizzati o simili, potrebbe essere necessario | Paint.ANTI_ALIAS_FLAGoppure il testo apparirà molto nitido. Ciò si manifesta nelle API inferiori il più delle volte.
Martin Marconcini,

4
A Kotlin:textView.paintFlags = textView.paintFlags or Paint.UNDERLINE_TEXT_FLAG
Albert Vila Calvo,

72

La risposta "accettato" di cui sopra fa non lavoro (quando si tenta di utilizzare la stringa simile textView.setText(Html.fromHtml(String.format(getString(...), ...))).

Come indicato nelle documentazioni, è necessario sfuggire (codifica entità HTML) alla parentesi di apertura dei tag interni con &lt;, ad esempio il risultato dovrebbe apparire come:

<resource>
    <string name="your_string_here">This is an &lt;u&gt;underline&lt;/u&gt;.</string>
</resources>

Quindi nel tuo codice puoi impostare il testo con:

TextView textView = (TextView) view.findViewById(R.id.textview);
textView.setText(Html.fromHtml(String.format(getString(R.string.my_string), ...)));

4
<u> sottolineato qui </u> funziona perfettamente. & lt; u> sottolinea & lt; / u> non ha funzionato. Questo è per Android 2.2. Forse versioni diverse lo interpretano in modo diverso.
user898763452

@autotravis quale è per 2.2? Non l'ho testato su versioni precedenti e sarà piuttosto sfortunato se versioni diverse lo gestiscono in modo diverso ... Anche almeno la documentazione attuale afferma che deve essere evitato (il link è nella risposta).
Ognyan,

Ho testato <u> sottolineato </u> su Android 2.3 e funziona. & lt; u> sottolinea & lt; / u> non funziona per 2.3. I documenti dicono "A volte potresti voler creare una risorsa di testo in stile che sia anche usata come stringa di formato. Normalmente, questo non funzionerà perché il metodo String.format (String, Object ...) eliminerà tutte le informazioni di stile dalla stringa. La soluzione è scrivere i tag HTML con entità con escape, che vengono quindi recuperati con fromHtml (String), dopo che è stata eseguita la formattazione. " Quindi immagino che useresti l'escaping se lo avessi eseguito attraverso quel metodo String.format (...).
user898763452

@autotravis sì, hai ragione. Lo uso con String.format (...). Ho modificato la mia risposta, grazie per il tuo feedback.
Ognyan,

Su 2.3 e 4.1 (solo quelli che ho provato finora) puoi semplicemente usare textView.setText (getText (R.string.text)) invece di dover usare getString (), Html.fromHtml () e String.format ().
Roy Solberg,

59

Contenuto del file Strings.xml:

<resource>
     <string name="my_text">This is an <u>underline</u>.</string> 
</resources> 

Il file XML di layout shold utilizza la risorsa stringa sopra con le proprietà seguenti della visualizzazione testo, come mostrato di seguito:

<TextView 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal"
    android:text="@string/my_text"

    android:selectAllOnFocus="false"
    android:linksClickable="false"
    android:autoLink="all"
    />

3
Assicurati di modificare il file di risorse della stringa all'interno dell'XML effettivo anziché all'interno dell'interfaccia utente di modifica dell'helper in Eclipse, poiché sfuggirà ai <s.
Chris Rae,

51

Per Button e TextView questo è il modo più semplice:

Pulsante:

Button button = (Button) findViewById(R.id.btton1);
button.setPaintFlags(button.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);

TextView:

TextView textView = (TextView) findViewById(R.id.textview1);
textView.setPaintFlags(textView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);

Soluzione molto elegante. Grazie!
Adrian,

20

Una soluzione di linea

myTextView.setText(Html.fromHtml("<p><u>I am Underlined text</u></p>"));

È un po 'tardi ma potrebbe essere utile per qualcuno.


20

In Kotlin è possibile utilizzare la funzione di estensione . Questo può essere usato solo dal codice, non da xml.

fun TextView.underline() {
    paintFlags = paintFlags or Paint.UNDERLINE_TEXT_FLAG
}

Uso:

 tv_change_number.underline()
 tv_resend_otp.underline()

13

controlla lo stile del pulsante cliccabile sottolineato:

<TextView
    android:id="@+id/btn_some_name"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/btn_add_contact"
    android:textAllCaps="false"
    android:textColor="#57a0d4"
    style="@style/Widget.AppCompat.Button.Borderless.Colored" />

strings.xml:

<string name="btn_add_contact"><u>Add new contact</u></string>

Risultato:

inserisci qui la descrizione dell'immagine


L'aspetto grafico di Widget.AppCompat.Button.Borderless.Colored è molto meglio di sottolineare, tuttavia, come descritto da @Kiril Vashilo, puoi farlo comunque.
xarlymg89,

11

L'approccio più recente di disegno del testo sottolineato è descritto da Romain Guy su supporto con codice sorgente disponibile su GitHub . Questa applicazione di esempio espone due possibili implementazioni:

  • Un'implementazione basata su percorso che richiede il livello API 19
  • Un'implementazione basata su regione che richiede il livello API 1

inserisci qui la descrizione dell'immagine


10

So che questa è una risposta tardiva, ma ho trovato una soluzione che funziona abbastanza bene ... Ho preso la risposta da Anthony Forloney per sottolineare il testo nel codice e ho creato una sottoclasse di TextView che lo gestisce per te. Quindi puoi semplicemente usare la sottoclasse in XML ogni volta che vuoi avere un TextView sottolineato.

Ecco la classe che ho creato:

import android.content.Context;
import android.text.Editable;
import android.text.SpannableString;
import android.text.TextWatcher;
import android.text.style.UnderlineSpan;
import android.util.AttributeSet;
import android.widget.TextView;

/**
 * Created with IntelliJ IDEA.
 * User: Justin
 * Date: 9/11/13
 * Time: 1:10 AM
 */
public class UnderlineTextView extends TextView
{
    private boolean m_modifyingText = false;

    public UnderlineTextView(Context context)
    {
        super(context);
        init();
    }

    public UnderlineTextView(Context context, AttributeSet attrs)
    {
        super(context, attrs);
        init();
    }

    public UnderlineTextView(Context context, AttributeSet attrs, int defStyle)
    {
        super(context, attrs, defStyle);
        init();
    }

    private void init()
    {
        addTextChangedListener(new TextWatcher()
        {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after)
            {
                //Do nothing here... we don't care
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count)
            {
                //Do nothing here... we don't care
            }

            @Override
            public void afterTextChanged(Editable s)
            {
                if (m_modifyingText)
                    return;

                underlineText();
            }
        });

        underlineText();
    }

    private void underlineText()
    {
        if (m_modifyingText)
            return;

        m_modifyingText = true;

        SpannableString content = new SpannableString(getText());
        content.setSpan(new UnderlineSpan(), 0, content.length(), 0);
        setText(content);

        m_modifyingText = false;
    }
}

Ora ... ogni volta che vuoi creare una visualizzazione di testo sottolineata in XML, devi solo fare quanto segue:

<com.your.package.name.UnderlineTextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:gravity="center"
    android:text="This text is underlined"
    android:textColor="@color/blue_light"
    android:textSize="12sp"
    android:textStyle="italic"/>

Ho aggiunto ulteriori opzioni in questo frammento XML per mostrare che il mio esempio funziona con la modifica del colore, della dimensione e dello stile del testo ...

Spero che sia di aiuto!


2
Mentre questo esempio funziona, mi sono reso conto rapidamente che se mai avessi voglia di avere un controllo aggiuntivo in XML che questo non avrebbe funzionato ... Sono passato a una soluzione migliore che prevede i seguenti passaggi: 1) Sottoclasse testuale 2) Aggiungi supporto per sottolineare il testo tramite attributi personalizzati per fare la sottolineatura come sopra specificato. L'unica differenza è che si esegue il codice di sottolineatura solo se è impostato l'attributo personalizzato.
Giustino,

10

Un modo più pulito invece del
textView.setPaintFlags(textView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG); metodo è quello di utilizzare textView.getPaint().setUnderlineText(true);

E se in un secondo momento devi disattivare la sottolineatura per quella vista, ad esempio in una vista riutilizzata in un RecyclerView, textView.getPaint().setUnderlineText(false);


7

Usa l'attributo nel file di risorse della stringa, ad es

<string name="example"><u>Example</u></string>

7

Ho usato questo disegno XML per creare un bordo inferiore e ho applicato il disegno come sfondo alla mia visualizzazione di testo

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="rectangle" >
            <solid android:color="@android:color/transparent" />
        </shape>
    </item>

    <item android:top="-5dp" android:right="-5dp" android:left="-5dp">
        <shape>
            <solid android:color="@android:color/transparent" />
            <stroke
                    android:width="1.5dp"
                    android:color="@color/pure_white" />
        </shape>
    </item>
</layer-list>

questa è la soluzione perfetta per tutte le sottolineature della vista con colori personalizzati. non mancare di rispetto allo sfondo trasparente qui, per Android 4 è necessario, la tua vista avrà uno sfondo nero senza
Ivan Mitsura

5

Una soluzione semplice e flessibile in xml:

<View
  android:layout_width="match_parent"
  android:layout_height="3sp"
  android:layout_alignLeft="@+id/your_text_view_need_underline"
  android:layout_alignRight="@+id/your_text_view_need_underline"
  android:layout_below="@+id/your_text_view_need_underline"
  android:background="@color/your_color" />

4

un'altra soluzione è quella di creare una vista personalizzata che estenda TextView come mostrato di seguito

public class UnderLineTextView extends TextView {

    public UnderLineTextView(Context context) {
        super(context);
        this.setPaintFlags(Paint.UNDERLINE_TEXT_FLAG);
    }

    public UnderLineTextView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        this.setPaintFlags(Paint.UNDERLINE_TEXT_FLAG);
    }

}

e basta aggiungere a XML come mostrato di seguito

<yourpackage.UnderLineTextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="underline text"
 />

Eccezionale!! Ma il colore della sottolineatura è grigio come cambiarlo in nero o in qualsiasi altro colore?
Ohhh

3

Ho semplificato la risposta di Samuel :

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <!--https://stackoverflow.com/a/40706098/4726718-->
    <item
        android:left="-5dp"
        android:right="-5dp"
        android:top="-5dp">
        <shape>
            <stroke
                android:width="1.5dp"
                android:color="@color/colorAccent" />
        </shape>
    </item>
</layer-list>

3

Ho creato questo metodo per facilità

TextView tv = findViewById(R.id.tv);
tv.setText("some text");

Sottolineare TextView intero

setUnderLineText(tv, tv.getText().toString());

Sottolinea alcune parti di TextView

setUnderLineText(tv, "some");

Supporta anche i bambini di TextView come EditText, Button, Checkbox

public void setUnderLineText(TextView tv, String textToUnderLine) {
        String tvt = tv.getText().toString();
        int ofe = tvt.indexOf(textToUnderLine, 0);

        UnderlineSpan underlineSpan = new UnderlineSpan();
        SpannableString wordToSpan = new SpannableString(tv.getText());
        for (int ofs = 0; ofs < tvt.length() && ofe != -1; ofs = ofe + 1) {
            ofe = tvt.indexOf(textToUnderLine, ofs);
            if (ofe == -1)
                break;
            else {
                wordToSpan.setSpan(underlineSpan, ofe, ofe + textToUnderLine.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                tv.setText(wordToSpan, TextView.BufferType.SPANNABLE);
            }
        }
    }

controlla qui la mia risposta per evidenziare il testo cliccabile o per sottolineare più parti di TextView


2

prova questo codice

in XML

<resource>
 <string name="my_text"><![CDATA[This is an <u>underline</u>]]></string> 
</resources> 

nel codice

TextView textView = (TextView) view.findViewById(R.id.textview);
textView.setText(Html.fromHtml(getString(R.string.my_text)));

In bocca al lupo!


2
  1. Vai al file di risorse strings.xml
  2. Aggiungi una stringa nel file di risorse con un tag di sottolineatura HTML dove necessario.

strings.xml Esempio di sottolineatura HTML

  1. Chiama l'ID risorsa stringa nel tuo codice Java come segue:
sampleTextView.setText(R.string.sample_string);
  1. L'output dovrebbe avere la parola "Stackoverflow" sottolineata.

Inoltre, il seguente codice non stamperà la sottolineatura:

String sampleString = getString(R.string.sample_string);
sampleTextView.setText(sampleString);

Utilizzare invece il codice seguente per conservare il formato RTF:

CharSequence sampleString = getText(R.string.sample_string);
sampleTextView.setText(sampleString);

"È possibile utilizzare getString (int) o getText (int) per recuperare una stringa. GetText (int) mantiene qualsiasi stile rich text applicato alla stringa." Documentazione Android.

Fare riferimento alla documentazione: https://developer.android.com/guide/topics/resources/string-resource.html

Spero che questo possa essere d'aiuto.


2

La risposta più votata è giusta e più semplice. Tuttavia, a volte potresti scoprire che non funziona per alcuni font, ma funziona per altri (quale problema ho riscontrato quando ho a che fare con il cinese).

La soluzione è non utilizzare "WRAP_CONTENT" solo per TextView, perché non c'è spazio aggiuntivo per disegnare la linea. Puoi impostare un'altezza fissa su TextView o utilizzare android: paddingVertical con WRAP_CONTENT.


1
HtmlCompat.fromHtml(
                    String.format(context.getString(R.string.set_target_with_underline)),
                    HtmlCompat.FROM_HTML_MODE_LEGACY)
<string name="set_target_with_underline">&lt;u>Set Target&lt;u> </string>

Nota il simbolo Escape nel file xml


ha funzionato per me con i simboli di fuga, grazie!
Badr al

1

Per farlo in Kotlin:

yourTextView.paint?.isUnderlineText = true


0

È abbastanza tardi per rispondere a questo, ma supponiamo che se qualcuno vuole ottenere il testo in modo dinamico, allora possono usare questa semplice riga nel loro codice java che funziona:

 textView.setText(Html.fromHtml("<p><u>" + get_name + "</u></p>"));

-2

Ho avuto un problema in cui sto usando un font personalizzato e la sottolineatura creata con il trucco del file di risorse ( <u>Underlined text</u>) ha funzionato, ma Android è riuscito a trasformare la sottolineatura in una sorta di strike barrato.

Ho usato questa risposta per disegnare un bordo sotto la visualizzazione del testo: https://stackoverflow.com/a/10732993/664449 . Ovviamente questo non funziona per il testo sottolineato parzialmente o multilinea.

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.