Kan ik tekst in een Android-lay-out onderstrepen?

Hoe kan ik onderstreepte tekst in een Android-lay-out definiëren xmlBestand?


Antwoord 1, Autoriteit 100%

Het kan worden bereikt als u een gebruikt String Resource XML-bestand, dat HTML-tags zoals <b></b>, <i></i>en <u></u>.

<resources>
    <string name="your_string_here">This is an <u>underline</u>.</string>
</resources>

Als u iets wilt onderstrepen van CODE-GEBRUIK:

TextView textView = (TextView) view.findViewById(R.id.textview);
SpannableString content = new SpannableString("Content");
content.setSpan(new UnderlineSpan(), 0, content.length(), 0);
textView.setText(content);

Antwoord 2, Autoriteit 46%

U kunt proberen met

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

Antwoord 3, Autoriteit 6%

Het antwoord “Geaccepteerd” hierboven doet niet werk (wanneer u probeert de tekenreeks te gebruiken als textView.setText(Html.fromHtml(String.format(getString(...), ...))).

Zoals vermeld in de Documentaties u moet ontsnappen (HTML Entiteit gecodeerde) openingsbeugel van de innerlijke tags met &lt;, bijv Resultaat moet eruit zien:

<resource>
    <string name="your_string_here">This is an &lt;u&gt;underline&lt;/u&gt;.</string>
</resources>

In uw code kunt u de tekst instellen met:

TextView textView = (TextView) view.findViewById(R.id.textview);
textView.setText(Html.fromHtml(String.format(getString(R.string.my_string), ...)));

Antwoord 4, Autoriteit 5%

Strings.xml bestandsinhoud:

<resource>
     <string name="my_text">This is an <u>underline</u>.</string> 
</resources> 

Layout XML-bestand Shold Gebruik de bovenstaande stringresource met onderstaande eigenschappen van TextView, zoals hieronder weergegeven:

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

Antwoord 5, Autoriteit 5%

Voor knop en tekstview Dit is de eenvoudigste manier:

-knop:

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

Antwoord 6, Autoriteit 3%

In Kotlin kan de extensiefunctieworden gebruikt. Dit kan alleen worden gebruikt vanuit code, niet vanuit xml.

fun TextView.underline() {
    paintFlags = paintFlags or Paint.UNDERLINE_TEXT_FLAG
}

Gebruik:

tv_change_number.underline()
 tv_resend_otp.underline()

Antwoord 7, autoriteit 2%

Eenregelige oplossing

myTextView.setText(Html.fromHtml("<p><u>I am Underlined text</u></p>"));

Het is een beetje laat, maar kan nuttig zijn voor iemand.


Antwoord 8

bekijk de onderstreepte klikbare knopstijl:

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

Resultaat:


Antwoord 9

Om dat te doen in Kotlin:

yourTextView.paint?.isUnderlineText = true


Antwoord 10

Een schonere manier in plaats van de
textView.setPaintFlags(textView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
methode is om te gebruiken
textView.getPaint().setUnderlineText(true);

En als u later onderstrepen voor die weergave moet uitschakelen, zoals in een hergebruiktweergave in een recycerview, textView.getPaint().setUnderlineText(false);


Antwoord 11

Ik weet dat dit een late antwoord is, maar ik kwam met een oplossing die redelijk goed werkt … ik nam het antwoord van Anthony Forloney voor het onderstrepen van tekst in code en creëerde een subklasse van tekstview die dat voor u verwerkt. Dan kunt u gewoon de subklasse in XML gebruiken wanneer u maar een onderstreepte tekstview wilt hebben.

Hier is de klasse die ik heb gemaakt:

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

Nu… wanneer u een onderstreepte tekstweergave in XML wilt maken, doet u het volgende:

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

Ik heb extra opties toegevoegd aan dit XML-fragment om te laten zien dat mijn voorbeeld werkt met het wijzigen van de tekstkleur, -grootte en -stijl…

Hopelijk helpt dit!


Antwoord 12

De meest recente benadering van het tekenen van onderstreepte tekst wordt beschreven door Romain Guy op mediummet beschikbare broncode op GitHub.
Deze voorbeeldtoepassing laat twee mogelijke implementaties zien:

  • Een op paden gebaseerde implementatie waarvoor API-niveau 19 vereist is
  • een op regio gebaseerde implementatie die API-niveau 1 vereist


Antwoord 13

Gebruik gewoon het kenmerk in String Resource-bestand, b.v.

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

Antwoord 14

Ik heb deze XML-tekenable gebruikt om een ​​bottom-grens te maken en de opleiding op de achtergrond aan mijn tekstview

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

Antwoord 15

Makkelijkere manier

TextView tv = findViewById(R.id.tv);
tv.setText("some text");
setUnderLineText(tv, "some");

Ondersteuning ook TextView-childs zoals EditTekst, knop, selectievakje

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

Als je wilt

– Klikbare onderstreepte tekst?

– Meerdere delen van TextView onderstrepen?

Vervolgens Controleer dit antwoord


Antwoord 16

Een eenvoudige en flexibele oplossing 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" />

Antwoord 17

Ik heb het antwoord van Samuelvereenvoudigd:

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

Antwoord 18

een andere oplossing is om een aangepaste weergave te maken die TextView uitbreidt zoals hieronder weergegeven

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

en voeg gewoon toe aan xml zoals hieronder weergegeven

<yourpackage.UnderLineTextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="underline text"
 />

Antwoord 19

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

Veel succes!


Antwoord 20

Als u dit in XMLwilt bereiken, declareert u uw tekenreeks in resource en plaatst u die resourcewaarde in de onderstreepte tag (<u></u>) van HTML.
in TextView, voeg

. toe

android:text="@string/your_text_reference"

En in tekenreeksbronwaarde,

<string name="your_text_reference"><u>Underline me</u></string>

Als je dit programmatisch wilt bereiken, gebruik dan voor Kotlin

textView.paintFlags = textView.paintFlags or Paint.UNDERLINE_TEXT_FLAG

of,

textView.text = Html.fromHtml("<p><u>Underline me</u></p>")

Antwoord 21

  1. Ga naar strings.xml bronbestand
  2. Voeg waar nodig een tekenreeks toe in het bronbestand met een HTML-onderstrepingstag.

strings.xml HTML onderstreept voorbeeld

  1. Noem de tekenreeksresource-ID in uw Java-code als volgt aan:
sampleTextView.setText(R.string.sample_string);
  1. De uitvoer moet het woord “Stackoverflow” onderstreept hebben.

Bovendien zal de volgende code de onderstreping niet afdrukken:

String sampleString = getString(R.string.sample_string);
sampleTextView.setText(sampleString);

Gebruik in plaats daarvan de volgende code om de RTF-indeling te behouden:

CharSequence sampleString = getText(R.string.sample_string);
sampleTextView.setText(sampleString);

“U kunt gebruik maken van de GETString (INT) of GETTEXT (INT) om een ​​tekenreeks op te halen. GetText (INT) behoudt elke rijke tekststyling die op de tekenreeks wordt toegepast.” Android-documentatie.

Zie de documentatie: https://developer.Android. com / gids / onderwerpen / bronnen / string-resource.html

Ik hoop dat dit helpt.


Antwoord 22

Het bovenste gericht antwoord is goed en eenvoudigst. Soms vind je misschien dat je niet voor een lettertype werkt, maar voor anderen werken (welk probleem kwam ik net tegen bij het omgaan met Chinees.)

Oplossing is niet gebruik “Wrap_Content” alleen voor uw tekstview, want er is geen extra ruimte voor het tekenen van de lijn. U kunt vaste hoogte in uw tekstview instellen of Android gebruiken: Paddingvertical met Wrap_Content.


Antwoord 23

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>

Opmerking Het escape-symbool in XML-bestand


Antwoord 24

Zeer compact, kotlin-versie:

tvTitle.apply { 
    text = "foobar"
    paint?.isUnderlineText = true
}

Antwoord 25

Het is vrij laat om dit te beantwoorden, maar stel dat als iemand de tekst dynamisch wil krijgen, dan kunnen ze deze eenvoudige één regel in hun Java-code gebruiken die werkt:

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

Antwoord 26

Ik had een probleem waarbij ik een aangepast lettertype gebruikte en de onderstreping die was gemaakt met de truc met het bronbestand (<u>Underlined text</u>) werkte, maar Android slaagde erin om te transformeren de onderstreping tot een soort dal.

Ik heb dit antwoord gebruikt om zelf een rand onder de tekstweergave te tekenen: https://stackoverflow.com/a/10732993/664449. Uiteraard werkt dit niet voor gedeeltelijk onderstreepte tekst of meerregelige tekst.

Other episodes