Question

Comment puis-je définir souligné texte dans un fichier de mise en page xml Android?

Était-ce utile?

La solution

Il peut être atteint que si vous utilisez un ressource chaîne 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 de l'utilisation de code:

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

Autres conseils

Vous pouvez essayer avec

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

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

Comme indiqué dans le Documentations devez échapper (entité html codé) support d'ouverture des étiquettes internes avec &lt;, par exemple 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:

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

contenu du fichier strings.xml:

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

fichier xml Mise en page shold utiliser la ressource de chaîne ci-dessus avec des 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"
    />

Pour Button et TextView c'est la meilleure façon:

Bouton:

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

Une solution de 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.

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

  • Une mise en œuvre basée sur le chemin qui requiert un niveau API 19
  • Une mise en œuvre par régions qui requiert un niveau API 1

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

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

Utilisation:

 tv_change_number.underline()
 tv_resend_otp.underline()

Je sais que c'est une réponse tardive, mais je suis venu avec une solution qui fonctionne assez bien ... Je pris la réponse de Anthony Forloney pour souligner le texte, dans le code et créé une sous-classe de TextView qui gère pour vous. Ensuite, vous pouvez simplement utiliser la sous-classe en XML chaque fois que vous voulez avoir un TextView souligné.

Voici la classe I créé:

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

... chaque fois que vous voulez créer un textview en XML souligné, vous venez de 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 de XML pour montrer que mon exemple fonctionne avec le changement de la couleur du texte, la taille et le style ...

Hope this helps!

vérifier le style du bouton cliquable soulignée:

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

 ici

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

Et si vous avez besoin pour mettre plus tard au large pour souligner ce point de vue, par exemple dans une vue réutilisée dans un RecyclerView, textView.getPaint().setUnderlineText(false);

Il suffit d'utiliser l'attribut dans le fichier de ressource de chaîne par exemple.

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

J'ai utilisé ce xml drawable pour créer une bordure inférieure et appliqué la drawable comme l'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>

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

Bon sang, il est plus simple à utiliser

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

Souligné toute TextView

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

Soulignez une partie de TextView

setUnderLineText(tv, "some");
  

Aussi le soutien Childs TextView comme EditText, Button, cases à cocher

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érifier ma réponse ici pour rendre le texte souligné cliquable ou souligner plusieurs parties de TextView

Une autre solution consiste à créer une vue personnalisée qui se prolongent 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 à XML comme indiqué ci-dessous

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

essayez ce code

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!

I de réponse simplifié 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. Accédez au strings.xml fichier de ressources
  2. Ajouter une chaîne dans le fichier de ressources avec une balise HTML soulignement si nécessaire.
  

strings.xml HTML souligner l'échantillon

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

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

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

Au lieu, 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 riche appliqué à la chaîne." Documentation Android.

Reportez-vous à la documentation: https://developer.android. com / Guide / thèmes / ressources / string-resource.html

J'espère que cette aide.

Le sommet voté réponse est juste et simple. Cependant, parfois, vous pouvez constater que ne fonctionne pas pour une police, mais en travaillant pour les autres. (Quel est le problème que je viens de rencontrer en traitant avec le chinois.)

La solution est de ne pas utiliser « WRAP_CONTENT » seulement pour votre TextView, parce qu'il n'y a pas d'espace supplémentaire pour tracer la ligne. Vous pouvez régler la hauteur fixe à votre TextView, ou utiliser Android. PaddingVertical avec WRAP_CONTENT

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 Escape dans le fichier xml

J'ai eu un problème où j'utilise une police personnalisée et le soulignement créé avec l'astuce de fichier de ressources (<u>Underlined text</u>) ne fonctionnait, mais Android a réussi à transformer le soulignement à une sorte de creux de grève.

J'ai utilisé cette réponse à dessiner une bordure en dessous du textview moi-même: https://stackoverflow.com/a/10732993/664449 . Il est évident que cela ne fonctionne pas pour le texte ou le texte partiel souligné multilined.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top