Wie kann ich unterstrichenen Text in einer xml
-Datei eines Android-Layouts definieren?
Dies kann erreicht werden, wenn Sie eine string Ressource xml-Datei verwenden, die HTML-Tags wie <b></b>
, <i></i>
und <u></u>
unterstützt.
<resources>
<string name="your_string_here">This is an <u>underline</u>.</string>
</resources>
Wenn Sie etwas vom Code unterstreichen 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);
Sie können es mit versuchen
textview.setPaintFlags(textview.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
Die obige "akzeptierte" Antwort funktioniert NICHT (wenn Sie versuchen, die Zeichenfolge wie textView.setText(Html.fromHtml(String.format(getString(...), ...)))
zu verwenden).
Wie in den Dokumentationen angegeben, müssen Sie die öffnende Klammer der inneren Tags mit <
, z. Ergebnis sollte folgendermaßen aussehen:
<resource>
<string name="your_string_here">This is an <u>underline</u>.</string>
</resources>
Dann können Sie in Ihrem Code den Text festlegen mit:
TextView textView = (TextView) view.findViewById(R.id.textview);
textView.setText(Html.fromHtml(String.format(getString(R.string.my_string), ...)));
Einzeilige Lösung:
textview.setPaintFlags(textview.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
Inhalt der Strings.xml-Datei:
<resource>
<string name="my_text">This is an <u>underline</u>.</string>
</resources>
Die Layout-XML-Datei muss die oben angegebene Zeichenfolge-Ressource 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) view.findViewById(R.id.btton1);
button.setPaintFlags(button.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
Textvorschau:
textView = (Textview) view.findViewById(R.id.textview1);
textView.setPaintFlags(textView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
myTextView.setText(Html.fromHtml("<p><u>I am Underlined text</u></p>"));
Es ist etwas spät, könnte aber für jemanden nützlich sein.
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 für die Unterstreichung von Text im Code genommen und eine Unterklasse von TextView erstellt, die das für Sie erledigt. Dann können Sie die Unterklasse in XML immer dann verwenden, wenn Sie eine unterstrichene TextView haben möchten.
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;
}
}
Wenn Sie nun eine unterstrichene Textansicht in XML erstellen möchten, führen Sie einfach folgende Schritte aus:
<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 die Textfarbe, -größe und -art ändert.
Hoffe das hilft!
schauen Sie sich den unterstrichenen Button 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" />
strings.xml:
<string name="btn_add_contact"><u>Add new contact</u></string>
Ergebnis:
Ein sauberer Weg statt dertextView.setPaintFlags(textView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
Methode ist zu verwenden textView.getPaint().setUnderlineText(true);
Wenn Sie die Unterstreichung für diese Ansicht später deaktivieren möchten, z. B. in einer wiederverwendeten Ansicht in einer RecyclerView, textView.getPaint().setUnderlineText(false);
In Kotlin Erweiterungsfunktion kann verwendet werden. Dies kann nur aus Code verwendet werden, nicht aus XML.
fun TextView.underline() {
paintFlags = paintFlags or Paint.UNDERLINE_TEXT_FLAG
}
Verwendungszweck:
tv_change_number.underline()
tv_resend_otp.underline()
TextView tv = findViewById(R.id.tv);
tv.setText("some text");
Ganze Textansicht unterstreichen
setUnderLineText(tv, tv.getText().toString());
Unterstreiche 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);
}
}
}
meine Antwort hier überprüfen, um klickbaren Text oder mehrere Teile von TextView zu unterstreichen
Verwenden Sie einfach das Attribut in der String-Ressourcendatei, z.
<string name="example"><u>Example</u></string>
Ich habe dieses XML-Zeichenelement verwendet, um einen unteren Rand zu erstellen, und das Zeichenobjekt als Hintergrund für meine Textansicht verwendet
<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>
sampleTextView.setText(R.string.sample_string);
Darüber hinaus druckt der folgende Code die Unterstreichung nicht:
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 den auf die Zeichenfolge angewandten Rich-Text-Stil bei." Android-Dokumentation.
Weitere Informationen finden Sie in der Dokumentation: https://developer.Android.com/guide/topics/resources/string-resource.html
Ich hoffe das hilft.
versuchen Sie diesen Code
in XML
<resource>
<string name="my_text"><![CDATA[This is an <u>underline</u>]]></string>
</resources>
in Code
TextView textView = (TextView) view.findViewById(R.id.textview);
textView.setText(Html.fromHtml(getString(R.string.my_text)));
Viel Glück!
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" />
Ich vereinfachte die Antwort von 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>
Die am besten gewählte Antwort ist richtig und am einfachsten. Manchmal kann es jedoch vorkommen, dass das nicht für eine Schriftart funktioniert, sondern für andere. (Welches Problem bin ich gerade beim Umgang mit Chinesisch aufgetreten?)
Lösung ist, verwenden Sie "WRAP_CONTENT" nicht nur für Ihre TextView, da für das Zeichnen der Linie kein zusätzlicher Platz vorhanden ist. Sie können eine feste Höhe für Ihr TextView festlegen oder Android verwenden: paddingVertical mit 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>
Beachten Sie das Escape-Symbol in der XML-Datei
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 einfach zu xml hinzufügen, wie unten gezeigt
<yourpackage.UnderLineTextView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="underline text"
/>