Puis-je souligner un texte dans une mise en page android?

Comment puis-je définir souligné texte dans un fichier Android layout xml ?

549
demandé sur gprathour 2010-03-07 05:26:35

20 réponses

il peut être réalisé si vous utilisez un string resource fichier xml, qui prend en charge les balises HTML comme <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 du code utiliser:

TextView textView = (TextView) view.findViewById(R.id.textview);
SpannableString content = new SpannableString("Content");
content.setSpan(new UnderlineSpan(), 0, content.length(), 0);
textView.setText(content);
941
répondu Anthony Forloney 2017-10-25 13:57:11

vous pouvez essayer avec

textview.setPaintFlags(textview.getPaintFlags() |   Paint.UNDERLINE_TEXT_FLAG);
449
répondu vado 2012-06-28 16:00:53

Le "accepté" la réponse ci-dessus n' PAS de travail (lorsque vous essayez d'utiliser la chaîne comme textView.setText(Html.fromHtml(String.format(getString(...), ...))) .

comme indiqué dans les documentations vous devez échapper (entité html encodé) ouverture bracket des étiquettes intérieures avec &lt; , par exemple résultat devrait ressembler à:

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

alors 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), ...)));
56
répondu Ognyan 2016-01-17 09:44:57

Une solution en ligne:

textview.setPaintFlags(textview.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
49
répondu Jiju Induchoodan 2015-10-02 07:25:13

les Chaînes.contenu du fichier xml:

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

Layout fichier xml shold utilisez la ressource de chaîne ci-dessus avec les propriétés ci-dessous de textview, comme montré 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"
    />
40
répondu Devendra Anurag 2017-11-15 10:18:19

pour Button et TextView c'est la manière la plus facile:

bouton:

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

Textview:

textView = (Textview) view.findViewById(R.id.textview1);
textView.setPaintFlags(textView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
28
répondu awsleiman 2018-01-12 15:31:45

Une solution en ligne

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

il est un peu tard mais pourrait être utile pour quelqu'un.

17
répondu gprathour 2015-03-17 05:46:26

je sais que c'est une réponse tardive, mais j'ai trouvé une solution qui fonctionne assez bien... J'ai pris la réponse D'Anthony Forloney pour souligner le texte dans le code et créé une sous-classe de TextView qui gère cela pour vous. Ensuite, vous pouvez simplement utiliser la sous-classe en XML chaque fois que vous voulez 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 un TextView souligné en XML, vous faire ce qui 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 XML pour montrer que mon exemple fonctionne avec la modification de la couleur, la taille et le style du texte...

Espérons que cette aide!

9
répondu Justin 2013-09-11 07:41:24

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

les chaînes.xml:

<string name="btn_add_contact"><u>Add new contact</u></string>

résultat:

enter image description here

7
répondu Kirill Vashilo 2017-08-29 08:16:48

L'approche la plus récente du dessin souligné est décrite par Romain Guy sur medium avec le code source disponible sur GitHub . Cet exemple d'application expose deux implémentations possibles:

  • Un Chemin d'accès de base de la mise en œuvre qui nécessite de l'API de niveau 19
  • d'Une Région basée sur la mise en œuvre qui nécessite de l'API de niveau 1

enter image description here

7
répondu Volodymyr Khodonovych 2018-06-05 10:10:26

une voie plus propre au lieu du

textView.setPaintFlags(textView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG); la méthode consiste à utiliser textView.getPaint().setUnderlineText(true);

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

4
répondu jk7 2018-03-14 00:49:33

il suffit D'utiliser l'attribut dans le fichier de ressources string par exemple

<string name="example"><u>Example</u></string>
3
répondu HeisenBrg 2017-11-16 05:44:24

Bon sang, c'est le plus simple à utiliser

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

soulignement texte entier

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

soulignent une partie de TextView

setUnderLineText(tv, "some");

supporte aussi TextView childs comme 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 faire cliquable soulignement texte ou soulignement plusieurs parties de TextView

3
répondu Khemraj 2018-05-24 06:54:47

essayez ce code

en XML

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

dans le Code

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

Bonne Chance!

2
répondu Andrew.J 2014-08-04 11:18:20

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
répondu user3786340 2017-03-31 12:35:50

j'ai utilisé ce drawable xml pour créer une bordure inférieure et j'ai appliqué le drawable comme arrière-plan à mon textview

<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
répondu Samuel 2018-04-16 22:36:04
  1. Aller à cordes.fichier de ressources xml
  2. ajouter une chaîne de caractères dans le fichier de ressources avec une balise HTML de soulignement si nécessaire.

les chaînes.xml HTML soulignement exemple

  1. appelez L'ID de Ressource de chaîne dans votre code Java comme suit:
sampleTextView.setText(R.string.sample_string);
  1. le la sortie doit avoir le mot "Stackoverflow" souligné.

en outre, le code suivant ne sera pas imprimer le soulignement:

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

utilisez plutôt le code suivant pour conserver le format Rich text:

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 tout style de texte riche appliqué à la chaîne." Android documentation.

se référer à la documentation: https://developer.android.com/guide/topics/resources/string-resource.html

j'espère que ça aidera.

2
répondu Fahmi Eshaq 2018-07-06 08:52:30

, j'ai simplifié Samuel 's réponse:

<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>
0
répondu Darush 2018-04-16 22:31:01

pour les utilisateurs de Kotlin: Cela ne vous permettra pas de souligner le texte en xml. Cependant, la fonction D'Extension vous aidera.

val TextView.underline: Unit
get() {
    this.paintFlags = this.getPaintFlags() or Paint.UNDERLINE_TEXT_FLAG
}

Utilisation:

 tv_change_number.underline
 tv_resend_otp.underline
0
répondu Killer 2018-08-16 11:36:34

j'ai eu un problème où j'utilise une police personnalisée et le soulignement créé avec le fichier ressource trick ( <u>Underlined text</u> ) a fonctionné mais Android a réussi à transformer le soulignement en une sorte de creux de grève.

j'ai utilisé cette réponse pour dessiner moi-même une bordure sous le textview: https://stackoverflow.com/a/10732993/664449 . Évidemment cela ne fonctionne pas pour le texte souligné partiel ou le texte multiliné.

-2
répondu Rick Pastoor 2017-05-23 12:02:56