Antworten:
Es kann erreicht werden , wenn Sie eine verwenden String - Ressource XML - Datei, die HTML - Unterstützung für Tags wie <b></b>
, <i></i>
und <u></u>
.
<resources>
<string name="your_string_here">This is an <u>underline</u>.</string>
</resources>
Wenn Sie etwas aus dem Code hervorheben möchten, verwenden Sie:
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>
Tags nicht funktioniert, z. B. manchmal, wenn Sie eine benutzerdefinierte Schriftart verwenden. Die programmgesteuerte UnderlineSpan
Basis von hat mich jedoch noch nicht gescheitert, daher würde ich sie als die zuverlässigste Lösung empfehlen.
Sie können mit versuchen
textview.setPaintFlags(textview.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
| Paint.ANTI_ALIAS_FLAG
da sonst der Text sehr scharf aussieht. Dies manifestiert sich häufig in niedrigeren APIs.
textView.paintFlags = textView.paintFlags or Paint.UNDERLINE_TEXT_FLAG
Die obige "akzeptierte" Antwort funktioniert NICHT (wenn Sie versuchen, die Zeichenfolge wie zu verwenden textView.setText(Html.fromHtml(String.format(getString(...), ...)))
.
Wie in den Dokumentationen angegeben , müssen Sie die öffnende Klammer der inneren Tags mit (HTML-Entity-codiert) maskieren <
, z. B. sollte das Ergebnis wie folgt aussehen:
<resource>
<string name="your_string_here">This is an <u>underline</u>.</string>
</resources>
Dann können Sie in Ihrem Code den Text einstellen mit:
TextView textView = (TextView) view.findViewById(R.id.textview);
textView.setText(Html.fromHtml(String.format(getString(R.string.my_string), ...)));
Inhalt der Datei Strings.xml:
<resource>
<string name="my_text">This is an <u>underline</u>.</string>
</resources>
Die XML-Layoutdatei sollte die obige Zeichenfolgenressource mit den folgenden Eigenschaften der Textansicht verwenden, wie unten gezeigt:
<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"
/>
Für Button und TextView ist dies der einfachste Weg:
Taste:
Button button = (Button) findViewById(R.id.btton1);
button.setPaintFlags(button.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
Textübersicht:
TextView textView = (TextView) findViewById(R.id.textview1);
textView.setPaintFlags(textView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
Schauen Sie sich den unterstrichenen anklickbaren Schaltflächenstil an:
<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" />
string.xml:
<string name="btn_add_contact"><u>Add new contact</u></string>
Ergebnis:
Der neueste Ansatz zum Zeichnen von unterstrichenem Text wird von Romain Guy auf Medium mit verfügbarem Quellcode auf GitHub beschrieben . Diese Beispielanwendung zeigt zwei mögliche Implementierungen:
Ich weiß, dass dies eine späte Antwort ist, aber ich habe eine Lösung gefunden, die ziemlich gut funktioniert ... Ich habe die Antwort von Anthony Forloney zum Unterstreichen von Text im Code übernommen und eine Unterklasse von TextView erstellt, die dies für Sie erledigt. Dann können Sie die Unterklasse einfach in XML verwenden, wenn Sie eine unterstrichene Textansicht wünschen.
Hier ist die Klasse, die ich erstellt habe:
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;
}
}
Jetzt ... wann immer Sie eine unterstrichene Textansicht in XML erstellen möchten, gehen Sie einfach wie folgt vor:
<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"/>
Ich habe diesem XML-Snippet zusätzliche Optionen hinzugefügt, um zu zeigen, dass mein Beispiel mit dem Ändern der Textfarbe, -größe und -art funktioniert ...
Hoffe das hilft!
Ein sauberer Weg anstelle der
textView.setPaintFlags(textView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
Methode ist die Verwendung
textView.getPaint().setUnderlineText(true);
Und wenn Sie später die Unterstreichung für diese Ansicht deaktivieren müssen, z. B. in einer wiederverwendeten Ansicht in einer RecyclerView, textView.getPaint().setUnderlineText(false);
Ich habe dieses XML-Zeichen verwendet, um einen unteren Rand zu erstellen, und das Zeichen als Hintergrund auf meine Textansicht angewendet
<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>
Eine einfache und flexible Lösung 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" />
Eine andere Lösung besteht darin, eine benutzerdefinierte Ansicht zu erstellen, die TextView wie unten gezeigt erweitert
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);
}
}
und füge es einfach wie unten gezeigt zu xml hinzu
<yourpackage.UnderLineTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="underline text"
/>
Ich habe Samuels Antwort vereinfacht :
<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");
Unterstreichen Sie die gesamte Textansicht
setUnderLineText(tv, tv.getText().toString());
Unterstreichen Sie einen Teil von TextView
setUnderLineText(tv, "some");
Unterstützt auch TextView-Childs wie 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);
Darüber hinaus gibt der folgende Code die Unterstreichung nicht aus:
String sampleString = getString(R.string.sample_string);
sampleTextView.setText(sampleString);
Verwenden Sie stattdessen den folgenden Code, um das Rich-Text-Format beizubehalten:
CharSequence sampleString = getText(R.string.sample_string);
sampleTextView.setText(sampleString);
"Sie können entweder getString (int) oder getText (int) verwenden, um eine Zeichenfolge abzurufen. GetText (int) behält alle auf die Zeichenfolge angewendeten Rich-Text-Stile bei." Android-Dokumentation.
Weitere Informationen finden Sie in der Dokumentation: https://developer.android.com/guide/topics/resources/string-resource.html
Ich hoffe das hilft.
Die am besten gewählte Antwort ist richtig und am einfachsten. Manchmal kann es jedoch vorkommen, dass dies nicht für einige Schriftarten funktioniert, sondern für andere. (Auf welches Problem bin ich gerade beim Umgang mit Chinesisch gestoßen.)
Die Lösung besteht darin, "WRAP_CONTENT" nicht nur für Ihre Textansicht zu verwenden, da kein zusätzlicher Platz zum Zeichnen der Linie vorhanden ist. Sie können eine feste Höhe für Ihre Textansicht festlegen oder android: paddingVertical mit WRAP_CONTENT verwenden.
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>
Beachten Sie das Escape-Symbol in der XML-Datei
Ich hatte ein Problem, bei dem ich eine benutzerdefinierte Schriftart verwende und die mit dem Trick der Ressourcendatei ( <u>Underlined text</u>
) erstellte Unterstreichung funktioniert hat, aber Android hat es geschafft, die Unterstreichung in eine Art Streik-Trog umzuwandeln.
Ich habe diese Antwort verwendet, um selbst einen Rahmen unter der Textansicht zu zeichnen: https://stackoverflow.com/a/10732993/664449 . Offensichtlich funktioniert dies nicht für teilweise unterstrichenen Text oder mehrzeiligen Text.