it-swarm.com.de

Kann ich Text in einem Android-Layout unterstreichen?

Wie kann ich unterstrichenen Text in einer xml-Datei eines Android-Layouts definieren?

583
Janusz

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);
1000

Sie können es mit versuchen 

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

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 &lt;, z. Ergebnis sollte folgendermaßen aussehen:

<resource>
    <string name="your_string_here">This is an &lt;u>underline&lt;/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), ...)));
61
Ognyan

Einzeilige Lösung:

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

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"
    />
48
Devendra Anurag

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);
31
awsleiman

Einzeilige Lösung

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.

17
gprathour

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!

9
Justin

Der neueste Ansatz, unterstrichenen Text zu zeichnen, wird von Romain Guy auf medium mit verfügbarem Quellcode auf GitHub ..__ beschrieben.

  • Eine pfadbasierte Implementierung, für die API-Level 19 erforderlich ist 
  • Eine Region-basierte Implementierung, für die API-Level 1 erforderlich ist

 enter image description here

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:

 enter image description here

7
Kirill Vashilo

Ein sauberer Weg statt der
textView.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);

6
jk7

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()
4
Killer

Verdammt, es ist am einfachsten zu benutzen

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

3
Khemraj

Verwenden Sie einfach das Attribut in der String-Ressourcendatei, z.

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

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>
2
Samuel
  1. Wechseln Sie zur Ressourcendatei strings.xml
  2. Fügen Sie in der Ressourcendatei gegebenenfalls einen String mit einem HTML-Unterstreichungs-Tag hinzu.

strings.xml Beispiel für HTML-Unterstreichung

  1. Rufen Sie die Zeichenfolgenressourcen-ID in Ihrem Java-Code wie folgt auf:
sampleTextView.setText(R.string.sample_string);
  1. Die Ausgabe sollte das Word "Stackoverflow" unterstrichen haben.

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.

2
Fahmi Eshaq

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!

2
Andrew.J

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" />
2
user3786340

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>
1
Darush

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.

0
Ray Lee
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>

Beachten Sie das Escape-Symbol in der XML-Datei

0
lynn8570

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"
 />
0
has19