Kann ich Text in einem Android-Layout unterstreichen?

Antworten:

1142

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);
Anthony Forloney
quelle
49
Hallo, ich habe den obigen Ressourcen-XML-Code ausprobiert und er hat nicht funktioniert. Die <u> Unterstreichung </ u> wurde weiterhin als Klartext angezeigt
Jonathan
4
Siehe auch: android.text.Html.fromHtml (), das ein Spanned zurückgibt.
Mark Renouf
3
Sie sollten es in die Datei strings.xml selbst eingeben und nicht über die Schaltfläche Hinzufügen. Andernfalls erhalten Sie diese & lt; u & gt; in Ihrer Datei
strings.xml
3
Ich bin auf Fälle gestoßen, in denen das Durchlaufen von <u>Tags nicht funktioniert, z. B. manchmal, wenn Sie eine benutzerdefinierte Schriftart verwenden. Die programmgesteuerte UnderlineSpanBasis von hat mich jedoch noch nicht gescheitert, daher würde ich sie als die zuverlässigste Lösung empfehlen.
Giulio Piancastelli
26
Es wird nicht im Editor angezeigt, aber wenn Sie Ihre App starten, wird es unterstrichen.
Jean d'arme
533

Sie können mit versuchen

textview.setPaintFlags(textview.getPaintFlags() |   Paint.UNDERLINE_TEXT_FLAG);
vado
quelle
1
Vielleicht ein kleiner Punkt, aber OP wollte, dass dies in der XML-Layoutdatei definiert wird. Ansonsten ist dies eine großartige Lösung.
Kwishnu
4
Verwenden Sie diese Lösung, wenn Sie sie löschen möchten
Bobs
2
Diese Lösung kann auch für einen Button verwendet werden
Rudy Kurniawan
3
Vorsicht, wenn Sie benutzerdefinierte Schriftarten oder ähnliches verwenden, müssen Sie dies möglicherweise auch tun, | Paint.ANTI_ALIAS_FLAGda sonst der Text sehr scharf aussieht. Dies manifestiert sich häufig in niedrigeren APIs.
Martin Marconcini
4
In Kotlin:textView.paintFlags = textView.paintFlags or Paint.UNDERLINE_TEXT_FLAG
Albert Vila Calvo
72

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 &lt;, z. B. sollte das Ergebnis wie folgt aussehen:

<resource>
    <string name="your_string_here">This is an &lt;u&gt;underline&lt;/u&gt;.</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), ...)));
Ognyan
quelle
4
<u> hier unterstrichen </ u> funktioniert perfekt. & lt; u> unterstreichen & lt; / u> hat nicht funktioniert. Dies ist für Android 2.2. Vielleicht interpretieren verschiedene Versionen es unterschiedlich.
user898763452
@autotravis welches ist für 2.2? Ich habe es nicht auf älteren Versionen getestet und es wird ziemlich unglücklich sein, wenn verschiedene Versionen unterschiedlich damit umgehen ... Auch zumindest die aktuelle Dokumentation besagt, dass es maskiert werden muss (Link ist in der Antwort).
Ognyan
Ich habe <u> unterstrichen </ u> auf Android 2.3 getestet und es funktioniert. & lt; u> unterstreichen & lt; / u> funktioniert nicht für 2.3. In den Dokumenten heißt es: "Manchmal möchten Sie möglicherweise eine gestaltete Textressource erstellen, die auch als Formatzeichenfolge verwendet wird. Normalerweise funktioniert dies nicht, da die Methode String.format (String, Object ...) alle Stilinformationen entfernt Die Problemumgehung besteht darin, die HTML-Tags mit maskierten Entitäten zu schreiben, die dann nach der Formatierung mit fromHtml (String) wiederhergestellt werden. " Ich denke, Sie würden das Escapezeichen verwenden, wenn Sie es mit dieser String.format (...) -Methode ausführen.
user898763452
@autotravis ja, du bist richtig. Ich benutze es mit String.format (...). Ich habe meine Antwort bearbeitet, danke für Ihr Feedback.
Ognyan
In 2.3 und 4.1 (nur diejenigen, die ich bisher ausprobiert habe) können Sie einfach textView.setText (getText (R.string.text)) verwenden, anstatt getString (), Html.fromHtml () und String.format () verwenden zu müssen.
Roy Solberg
59

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"
    />
Devendra Anurag
quelle
3
Stellen Sie sicher, dass Sie die String-Ressourcendatei im eigentlichen XML-Format und nicht in der Benutzeroberfläche für die Hilfsbearbeitung in Eclipse bearbeiten. Andernfalls werden die <s ausgeblendet.
Chris Rae
51

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);
awsleiman
quelle
Sehr elegante Lösung. Vielen Dank!
Adrian
20

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.

gprathour
quelle
18

In Kotlin kann die Erweiterungsfunktion 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()
Mörder
quelle
13

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:

Geben Sie hier die Bildbeschreibung ein

Kirill Vashilo
quelle
Das Erscheinungsbild von Widget.AppCompat.Button.Borderless.Colored ist viel besser als das Unterstreichen. Wie @Kiril Vashilo beschrieben hat, können Sie dies jedoch trotzdem tun.
Xarlymg89
11

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:

  • Eine pfadbasierte Implementierung, für die API-Level 19 erforderlich ist
  • Eine auf Regionen basierende Implementierung, für die API-Ebene 1 erforderlich ist

Geben Sie hier die Bildbeschreibung ein

Volodymyr
quelle
10

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!

Justin
quelle
2
Während dieses Beispiel funktioniert, wurde mir schnell klar, dass, wenn Sie jemals zusätzliche Kontrolle in XML haben möchten, dies einfach nicht funktioniert ... Ich habe zu einer besseren Lösung gewechselt, die die folgenden Schritte umfasst: 1) Textansicht der Unterklasse 2) Unterstützung hinzufügen um den Text über benutzerdefinierte Attribute zu unterstreichen und die Unterstreichung wie oben angegeben durchzuführen. Der einzige Unterschied besteht darin, dass Sie den Unterstreichungscode nur ausführen, wenn das benutzerdefinierte Attribut festgelegt ist.
Justin
10

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

jk7
quelle
7

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

<string name="example"><u>Example</u></string>
adityasnl
quelle
7

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>
Samuel
quelle
Dies ist die perfekte Lösung für alle Ansichten, die mit benutzerdefinierten Farben unterstrichen werden. Respektieren Sie nicht den transparenten Hintergrund hier, für Android 4 ist es erforderlich, Ihre Ansicht wird schwarzen Hintergrund ohne ihn haben
Ivan Mitsura
5

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" />
user3786340
quelle
4

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"
 />
has19
quelle
Genial!! Aber die Farbe der Unterstreichung ist grau. Wie kann man sie in schwarz oder eine andere Farbe ändern?
OhhhThatVarun
3

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>
Darush
quelle
3

Ich habe diese Methode zur Vereinfachung erstellt

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

Überprüfen Sie meine Antwort hier, um anklickbaren Text zu unterstreichen oder mehrere Teile von TextView zu unterstreichen

Khemraj
quelle
2

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!

Andrew.J
quelle
2
  1. Wechseln Sie zur Ressourcendatei strings.xml
  2. Fügen Sie der Ressourcendatei bei Bedarf eine Zeichenfolge mit einem HTML-Unterstreichungs-Tag hinzu.

string.xml HTML-Unterstreichungsbeispiel

  1. Rufen Sie die String-Ressourcen-ID in Ihrem Java-Code wie folgt auf:
sampleTextView.setText(R.string.sample_string);
  1. In der Ausgabe sollte das Wort "Stackoverflow" unterstrichen sein.

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.

Fahmi Eshaq
quelle
2

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.

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

Beachten Sie das Escape-Symbol in der XML-Datei

lynn8570
quelle
arbeitete für mich mit den Fluchtsymbolen, Danke!
Badr am
1

Um das in Kotlin zu tun:

yourTextView.paint?.isUnderlineText = true

Re'em
quelle
0

Es ist ziemlich spät, dies zu beantworten, aber wenn jemand den Text dynamisch abrufen möchte, kann er diese einfache einzeilige Zeile in seinem Java-Code verwenden, die funktioniert:

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

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.

Rick Pastoor
quelle