Risposte:
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);
<u>
tag sottostanti non funzionano, ad esempio a volte se si utilizza un carattere personalizzato. Tuttavia, a livello di programmazione da parte di UnderlineSpan
deve ancora fallire su di me, quindi lo consiglierei come la soluzione più affidabile.
Puoi provare con
textview.setPaintFlags(textview.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
| Paint.ANTI_ALIAS_FLAG
oppure il testo apparirà molto nitido. Ciò si manifesta nelle API inferiori il più delle volte.
textView.paintFlags = textView.paintFlags or Paint.UNDERLINE_TEXT_FLAG
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 <
, ad esempio il risultato dovrebbe apparire come:
<resource>
<string name="your_string_here">This is an <u>underline</u>.</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), ...)));
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"
/>
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);
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:
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:
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!
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);
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>
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" />
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"
/>
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>
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);
}
}
}
sampleTextView.setText(R.string.sample_string);
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.
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.
HtmlCompat.fromHtml(
String.format(context.getString(R.string.set_target_with_underline)),
HtmlCompat.FROM_HTML_MODE_LEGACY)
<string name="set_target_with_underline"><u>Set Target<u> </string>
Nota il simbolo Escape nel file xml
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.