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.