web-dev-qa-db-fra.com

Puis-je souligner du texte dans une mise en page Android?

Comment définir un texte souligné dans un fichier de disposition xml sous Android

583
Janusz

Cela peut être réalisé si vous utilisez un fichier string resource xml, qui supporte les balises HTML telles que <b></b>, <i></i> et <u></u>.

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

Si vous voulez souligner quelque chose dans le code, utilisez: 

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

Vous pouvez essayer avec 

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

La réponse "acceptée" ci-dessus ne fonctionne PAS (lorsque vous essayez d'utiliser la chaîne telle que textView.setText(Html.fromHtml(String.format(getString(...), ...))).

Comme indiqué dans la documentations vous devez échapper le crochet d’ouverture des balises internes (codé en HTML) avec &lt;, par exemple le résultat devrait ressembler à:

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

Ensuite, dans votre code, vous pouvez définir le texte avec:

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

Une solution en ligne:

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

Contenu du fichier Strings.xml:

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

Layout xml file shold utilise la ressource chaîne ci-dessus avec les propriétés ci-dessous de textview, comme indiqué ci-dessous:

<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

Pour Button et TextView, c'est le moyen le plus simple:

Bouton: 

button = (Button) view.findViewById(R.id.btton1);
button.setPaintFlags(button.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);

Affichage: 

textView = (Textview) view.findViewById(R.id.textview1);
textView.setPaintFlags(textView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
31
awsleiman

Je sais que la réponse est tardive, mais j’ai proposé une solution qui fonctionne assez bien. J'ai repris la réponse d’Anthony Forloney pour souligner le texte dans le code et créer une sous-classe de TextView qui la gère pour vous. Ensuite, vous pouvez simplement utiliser la sous-classe en XML chaque fois que vous souhaitez avoir un TextView souligné.

Voici la classe que j'ai créée:

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

Maintenant ... chaque fois que vous voulez créer une vue texte soulignée en XML, procédez comme suit:

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

J'ai ajouté des options supplémentaires dans cet extrait de code XML pour montrer que mon exemple fonctionne avec la modification de la couleur, de la taille et du style du texte ...

J'espère que cela t'aides!

9
Justin

L’approche la plus récente en matière de dessin du texte souligné est décrite par Romain Guy sur moyen avec le code source disponible sur GitHub .

  • Une implémentation basée sur le chemin qui requiert le niveau 19 de l'API 
  • Une implémentation basée sur une région nécessitant un niveau 1 de l'API

 enter image description here

7

découvrez le style de bouton cliquable souligné:

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

Résultat:

 enter image description here

7
Kirill Vashilo

Une façon plus propre au lieu de
textView.setPaintFlags(textView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG); Méthode consiste à utiliser textView.getPaint().setUnderlineText(true);

Et si vous devez ultérieurement désactiver le soulignement pour cette vue, comme dans une vue réutilisée dans un RecyclerView, textView.getPaint().setUnderlineText(false);

6
jk7

Dans Kotlin fonction d'extension peut être utilisé. Cela ne peut être utilisé qu'à partir de code, pas de xml.

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

Usage: 

 tv_change_number.underline()
 tv_resend_otp.underline()
4
Killer

Bon sang, c'est le plus simple à utiliser

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

Souligne tout TextView

setUnderLineText(tv, tv.getText().toString());

Souligne une partie de TextView

setUnderLineText(tv, "some");

Prend également en charge les enfants TextView tels que 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);
            }
        }
    }

vérifiez ma réponse ici pour rendre le texte de soulignement cliquable ou souligner plusieurs parties de TextView

3
Khemraj

Utilisez simplement l'attribut dans le fichier de ressources de chaîne, par exemple.

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

J'ai utilisé ce dessin XML pour créer une bordure inférieure et appliqué le dessinable comme arrière-plan à ma vue de texte

<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. Aller au fichier de ressources strings.xml
  2. Ajoutez une chaîne dans le fichier de ressources avec une balise de soulignement HTML si nécessaire.

Exemple de soulignement HTML de strings.xml

  1. Appelez l'ID de ressource de chaîne dans votre code Java comme suit:
sampleTextView.setText(R.string.sample_string);
  1. La sortie devrait avoir le mot "Stackoverflow" souligné.

De plus, le code suivant n'imprimera pas le soulignement:

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

À la place, utilisez le code suivant pour conserver le format de texte enrichi:

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

"Vous pouvez utiliser getString (int) ou getText (int) pour récupérer une chaîne. GetText (int) conserve le style de texte enrichi appliqué à la chaîne." Documentation Android.

Reportez-vous à la documentation: https://developer.Android.com/guide/topics/resources/string-resource.html

J'espère que ça aide.

2
Fahmi Eshaq

essayez ce code

en XML

<resource>
 <string name="my_text"><![CDATA[This is an <u>underline</u>]]></string> 
</resources> 

dans du code

TextView textView = (TextView) view.findViewById(R.id.textview);
textView.setText(Html.fromHtml(getString(R.string.my_text)));

Bonne chance!

2
Andrew.J

Une solution simple et flexible en 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

J'ai simplifié la réponse de 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

La réponse la plus votée est la bonne et la plus simple. Cependant, vous constaterez parfois que cela ne fonctionne pas pour certaines polices mais pour d'autres (quel problème que j'ai rencontré lors de l'utilisation du chinois).

La solution est de ne pas utiliser "WRAP_CONTENT" uniquement pour votre TextView, car il n'y a pas d'espace supplémentaire pour tracer la ligne. Vous pouvez définir une hauteur fixe pour votre TextView ou utiliser Android: paddingVertical avec 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>

Notez le symbole d'échappement dans le fichier XML

0
lynn8570

une autre solution consiste à créer une vue personnalisée qui étend TextView comme indiqué ci-dessous.

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

}

et juste ajouter au XML comme indiqué ci-dessous

<yourpackage.UnderLineTextView
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:text="underline text"
 />
0
has19