Pour dessiner un soulignement sous le TextView sous Android


Réponses:


323

Il existe trois façons de souligner le texte dans TextView.

  1. SpannableString

  2. setPaintFlags (); de TextView

  3. Html.fromHtml ();

Laissez-moi vous expliquer toutes les approches:

1ère approche

Pour souligner le texte dans TextView, vous devez utiliser SpannableString

String udata="Underlined Text";
SpannableString content = new SpannableString(udata);
content.setSpan(new UnderlineSpan(), 0, udata.length(), 0);
mTextView.setText(content);

2ème approche

Vous pouvez utiliser la méthode setPaintFlags de TextView pour souligner le texte de TextView.

Pour par exemple.

mTextView.setPaintFlags(mTextView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
mTextView.setText("This text will be underlined");

Vous pouvez faire référence aux constantes de la classe Paint si vous souhaitez barrer le texte.

3e approche

Se servir de Html.fromHtml(htmlString);

String htmlString="<u>This text will be underlined</u>";
mTextView.setText(Html.fromHtml(htmlString));

OU

txtView.setText(Html.fromHtml("<u>underlined</u> text"));

1
Heureux d'entendre ça ... Marquer cette question comme résolue afin que les autres utilisateurs puissent la renvoyer.
— Kartik Domadiya

4
Une troisième approche consisterait à utiliser Html.fromHtml("<u>This text will be underlined</u>"), mais je dois admettre que je suis beaucoup plus fan de l'utilisation de SpannableStrings. @Kartik: Vous pouvez aussi bien utiliser un StrikethroughSpansur le texte pour créer l'effet barré. :)
— MH.

J'adore la 3e approche. Court, simple et concis et ajoute juste une ligne de code supplémentaire à mon programme.
— Matt

Je sais que c'est un peu vieux, mais y a-t-il un moyen de définir l'épaisseur du soulignement?
— Andreas Wong

lequel de ceux-ci est utilisé pour le contenu preferencesActivity, dans PreferenceCategory?
— développeur android

40

entourez simplement votre texte avec la balise <u> dans votre fichier de ressources string.xml

<string name="your_string"><u>Underlined text</u></string>

et dans votre activité / fragment

mTextView.setText(R.string.your_string);

7
@CHAKRAVARTHI cela ne fonctionnera pas si vous convertissez le texte en chaîne avant le réglage. Par exemple textView.setText(getString(R.string.text)) <- faux . Droite: textView.setText(getText(R.string.text)) ou juste textView.setText(R.string.text). La raison beind ce que les getText()rendements Spannableavec des portées soulignement, mais si vous utilisez getString()ce convertira le Spannableà Stringrésultant étant portées supprimées.
— Yaroslav Mytkalyk

bon point! J'ai modifié ma réponse actuelle afin d'être plus claire
— Sarpe

19

Cela fonctionne pour moi.

tv.setPaintFlags(Paint.UNDERLINE_TEXT_FLAG);

11

Pour quiconque regarde encore cette question. Ceci est pour un lien hypertexte, mais vous pouvez le modifier pour un simple soulignement:

Créez un dessin (hyperlink_underline.xml):

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:top="-10dp"
        android:left="-10dp"
        android:right="-10dp">
    <shape android:shape="rectangle">
      <solid android:color="@android:color/transparent"/>

      <stroke android:width="2dp"
              android:color="#3498db"/>
    </shape>
  </item>
</layer-list>

Créez un nouveau style:

<style name="Hyperlink">
    <item name="android:textColor">#3498db</item>
    <item name="android:background">@drawable/hyperlink_underline</item>
  </style>

Ensuite, utilisez ce style sur votre TextView:

<TextView
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    local:MvxBind="Text Id; Click ShowJobInfoCommand"
    style="@style/HyperLink"/>

3

Si votre TextView a une largeur fixe, une solution alternative peut être de créer une vue qui ressemblera à un soulignement et de la positionner juste en dessous de votre TextView.

<RelativeLayout
   android:layout_width="match_parent"
   android:layout_height="match_parent">

        <TextView
            android:id="@+id/myTextView"
            android:layout_width="20dp"
            android:layout_height="wrap_content"/>

        <View
            android:layout_width="20dp"
            android:layout_height="1dp"
            android:layout_below="@+id/myTextView"
            android:background="#CCCCCC"/>
</RelativeLayout>

2

Une solution simple et durable consiste à créer une liste de calques et à en faire l'arrière-plan de votre TextView:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:left="-5dp"
        android:right="-5dp"
        android:top="-5dp">
        <shape>
            <stroke
                android:width="1.5dp"
                android:color="@color/colorAccent" />
        </shape>
    </item>
</layer-list>

2
C'est le meilleur choix s'il s'agit d'une vue de texte sur une seule ligne
— hushed_voice

0

souligner une vue de texte dans Android

5 façons étonnantes de souligner un TextView dans Android - Kotlin / Java et XML

  1. String html = "<u>Underline using Html.fromHtml()</u>"; textview.setText(Html.fromHtml(html));

Mais Html.fromHtml (ressource String) était obsolète dans l'API 24.

Vous pouvez donc utiliser la dernière bibliothèque de support Android androidx.core.text.HtmlCompat . Avant cela, vous devez inclure la dépendance dans votre projet.

`implementation 'androidx.core:core:1.0.1'`
  1. String html = "<u> 1.1 Underline using HtmlCompat.fromHtml()</u>"; //underline textview using HtmlCompat.fromHtml() method textview11.setText(HtmlCompat.fromHtml(html, HtmlCompat.FROM_HTML_MODE_LEGACY));

En utilisant strings.xml ,

  1. <string name="underline_text">1.3 &lt;u>Underline using HtmlCompat.fromHtml() and string resource&lt;/u></string>

textview13.setText(HtmlCompat.fromHtml(getString(R.string.underline_text), HtmlCompat.FROM_HTML_MODE_LEGACY));

utilisation de PaintFlags

  1. textview2.setPaintFlags(textview2.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG); textview2.setText("2. Underline using setPaintFlags()");

en utilisant SpannableString

`String content1 = "3.1 Underline using SpannableString";
        SpannableString spannableString1 = new SpannableString(content1);
        spannableString1.setSpan(new UnderlineSpan(), 0, content1.length(), 0);
        textview31.setText(spannableString1);`
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.