Comment souligner un texte dans Android XML?

108

Comment souligner un texte dans un fichier XML? Je ne trouve pas d'option dans textStyle.

Michael Zeuner
la source
vous avez essayé d'utiliserstyle="text-decoration: underline;"
ρяσѕρєя K
1
pourriez-vous en détail comment l'utiliser?
Michael Zeuner
vous avez essayé cecitextView.setText(Html.fromHtml("<u>"+"testest"+"</u>"));
ρяσѕρєя K

Réponses:

174

Si vous utilisez un fichier xml de ressource de chaîne (prend en charge les balises HTML), vous pouvez le faire en utilisant <b> </b>, <i> </i>et <u> </u>.

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

Si vous souhaitez souligner quelque chose à partir du code, utilisez:

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

J'espère que cela t'aides

George Artemiou
la source
9
J'ai essayé ça. la chaîne ne vient pas soulignée?
Michael Zeuner
5
J'ai rencontré des cas où les <u>balises sous-jacentes ne fonctionnaient pas, par exemple parfois si vous utilisez une police personnalisée. Cependant, sous-jacent programmatiquement par UnderlineSpann'a en effet jamais échoué sur moi, je le recommanderais donc comme la solution la plus fiable.
Giulio Piancastelli
Vous n'avez pas besoin de définir du texte en Java. Utilisez simplement <u>et <\u>en XML, et c'est suffisant.
Maksim Dmitriev
9
dans mon cas, l'aperçu du studio android n'a pas été en mesure de déterminer la balise html. mais une fois que j'ai exécuté le projet dans un appareil réel, le texte souligné est affiché avec bonheur.
Alvin
1
<whine> le fait que vous deviez convertir une chaîne en HTML alors que Google nous donne déjà gras / italique / normal est un joli jeu étant donné que nous avons Android depuis plus de 5 ans ... </whine>
angryITguy
57

Utilisez ceci:

TextView txt = (TextView) findViewById(R.id.Textview1);
txt.setPaintFlags(txt.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
abh22ishek
la source
Sachez que cette solution souligne toujours tout le texte, donc ce n'est pas faisable si l'on veut en souligner seulement une partie. Pour cela, vous avez besoin UnderlineSpan.
Giulio Piancastelli
25
<resource>
    <string name="your_string_here">This is an <u>underline</u>.</string>
</resources>

Si cela ne fonctionne pas alors

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

Parce que "<" peut être un mot clé à un moment donné.

Et pour afficher

TextView textView = (TextView) view.findViewById(R.id.textview);
textView.setText(Html.fromHtml(getString(R.string.your_string_here)));
Bhavin
la source
3
Cela fonctionne ... mais si pour une raison quelconque vous définissez TextView pour utiliser l'attribut xml android: textAllCaps = "true", le soulignement n'apparaîtra pas. Supprimez ce modificateur et le soulignement apparaîtra comme prévu. Juste un avertissement :)
Matt W
5

Tout d'abord, accédez au fichier String.xml

vous pouvez ajouter des attributs HTML comme, italique ou gras ou souligner ici.

    <resources>
        <string name="your_string_here">This is an <u>underline</u>.</string>
    </resources>
AndroidGeek
la source
3

Une autre façon de le faire consiste à créer un composant personnalisé étendant TextView. C'est bon pour les cas où vous devez avoir plusieurs TextViews soulignés.

Voici le code du composant:

package com.myapp.components;

import android.content.Context;
import android.support.v7.widget.AppCompatTextView;
import android.text.SpannableString;
import android.text.style.UnderlineSpan;
import android.util.AttributeSet;

public class LinkTextView extends AppCompatTextView {
    public LinkTextView(Context context) {
        this(context, null);
    }

    public LinkTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public void setText(CharSequence text, BufferType type) {
        SpannableString content = new SpannableString(text);
        content.setSpan(new UnderlineSpan(), 0, content.length(), 0);

        super.setText(content, type);
    }
}

Et comment l'utiliser en xml:

<com.myapp.components.LinkTextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Hello World!" />
Tharkius
la source
2

Pour compléter la réponse de Bhavin. Par exemple, pour ajouter un soulignement ou une redirection.

((TextView) findViewById(R.id.tv_cgu)).setText(Html.fromHtml(getString(R.string.upload_poi_CGU)));

<string name="upload_poi_CGU"><![CDATA[ J\'accepte les <a href="">conditions générales</a>]]></string>

et vous pouvez connaître les balises compatibles ici: http://commonsware.com/blog/Android/2010/05/26/html-tags-supported-by-textview.html

Anthone
la source
2

Vous pouvez utiliser le balisage ci-dessous, mais notez que si vous définissez le textAllCapssur, truel'effet de soulignement sera supprimé.

<resource>
    <string name="my_string_value">I am <u>underlined</u>.</string>
</resources>


Remarque

Utilisation de textAllCaps avec une chaîne (login_change_settings) qui contient du balisage; le balisage sera supprimé par la conversion des majuscules

La transformation de texte textAllCaps finira par appeler toString sur la CharSequence, ce qui a pour effet net de supprimer tout balisage tel que. Cette vérification recherche les utilisations des chaînes contenant du balisage qui spécifient également textAllCaps = true.

Tebo
la source
2

Il existe différentes manières d'obtenir du texte souligné dans un TextView Android.

1. <u>This is my underlined text</u> ou

I just want to underline <u>this</u> word

2. Vous pouvez faire la même chose par programmation.

`textView.setPaintFlags(textView.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);`

Cela peut être fait en créant un SpannableString, puis en le définissant comme propriété de texte TextView

SpannableString text = new SpannableString("Voglio sottolineare solo questa parola");
text.setSpan(new UnderlineSpan(), 25, 6, 0);
textView.setText(text);
Anandharaj R
la source
2

J'ai utilisé la méthode ci-dessous, cela a fonctionné pour moi. Ci-dessous, un exemple pour Button, mais nous pouvons également l'utiliser dans TextView.

Button btnClickMe = (Button) findViewById(R.id.btn_click_me);
btnClickMe.setPaintFlags(btnClickMe.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
Hitesh Dhamshaniya
la source
1

Si vous souhaitez comparer la chaîne de texte ou le texte changera dynamiquement, vous pouvez créer une vue dans la mise en page Contrainte, elle s'ajustera en fonction de la longueur du texte comme ceci

 <android.support.constraint.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/txt_Previous"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginLeft="16dp"
        android:layout_marginEnd="16dp"
        android:layout_marginRight="16dp"
        android:layout_marginBottom="8dp"
        android:gravity="center"
        android:text="Last Month Rankings"
        android:textColor="@color/colorBlue"
        android:textSize="15sp"
        android:textStyle="bold"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

    <View
        android:layout_width="0dp"
        android:layout_height="0.7dp"
        android:background="@color/colorBlue"
        app:layout_constraintEnd_toEndOf="@+id/txt_Previous"
        app:layout_constraintStart_toStartOf="@+id/txt_Previous"
        app:layout_constraintBottom_toBottomOf="@id/txt_Previous"/>


</android.support.constraint.ConstraintLayout>
MazRoid
la source
0
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);
            }
        }
    }

Le moyen le plus simple

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

Prend également en charge les enfants TextView comme EditText, Button, Checkbox

Si tu veux

- Texte de soulignement cliquable?

- Souligner plusieurs parties de TextView?

Ensuite, vérifiez cette réponse

Khemraj
la source