84 votes

Comment se débarrasser du soulignement dans une chaîne spannable avec un objet cliquable ?

Tengo un Spannable Object avec un Clickable Object de l'entreprise. Lorsque le Spannable String s'affiche dans l'écran TextView il comporte un texte bleu et un soulignement bleu (indiquant à l'utilisateur que ce texte est cliquable). Mon problème est de savoir comment empêcher l'apparition du soulignement bleu dans le texte. TextView ?

2voto

Azhagthott Points 357

Sur la base de la réponse de @ Sai Gopi Me

en Kotlin :

val clickableSpan: ClickableSpan = object : ClickableSpan() {
    override fun onClick(widget: View) {
        // some action here
    }

    override fun updateDrawState(ds: TextPaint) {
        super.updateDrawState(ds)
        ds.isUnderlineText = false
        }
    }
}

1voto

dcow Points 2921

spannableStringObject.toString() ;

Editer

SpannableString ss = getYourSpannableString();
UnderlineSpan[] uspans = ss.getSpans(0, ss.length(), UnderlineSpan.class);
for (UnderlineSpan us : uspans) {
    ss.removeSpan(us);
}

Supprime toutes les travées de soulignement de l'article.

1voto

Pradeep Gupta Points 1080
Try the below code to remove underlined and clicked event on multiple words in textview :

            String str="Angelina Clapped For Lester Kang";
            Spannable span = Spannable.Factory.getInstance().newSpannable(str);

            // 0 to 8 start and  index of Angelina
            span.setSpan(new ClickableSpan(str), 0, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

             //  21 to 32  start and  index of Lester  Kang
            span.setSpan(new ClickableSpan(str), 21, 32, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

            textview.setText(span);

             class ClickableSpan extends ClickableSpan{

                    String clicked;
                    public ClickableSpan (String string) {
                        super();

                    }

                    public void onClick(View v) {
                        Toast.makeText(MyActivity.this,""+((TextView)v).getText().toString(),Toast.LENGTH_SHORT).show();
                    }

                    public void updateDrawState(TextPaint ds) {
                       // override updateDrawState
                        ds.setUnderlineText(false); // set to false to remove underline
                    }
                }

1voto

Erik Terwan Points 11

La réponse d'ANURAG RASTOGI m'a sauvé la mise ! J'ai déjà un SpannableString sur lequel je voulais appliquer un ClickableSpan :

spannableString.setSpan(new ClickableSpan() {
    @Override
    public void onClick(View widget) {
        // Do something...
    }
    // Prevent
    // ds.setColor(ds.linkColor);
    // ds.setUnderlineText(true);
    // in: https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/text/style/ClickableSpan.java
    // from executing.
    @Override
    public void updateDrawState(@NonNull TextPaint ds) {
        // super.updateDrawState(ds);
    }
},0, spannableString.length(), SPAN_EXCLUSIVE_EXCLUSIVE);

En updateDrawState remplace l'option updateDrawState en el ClickableSpan dans Android, et en n'appelant pas la classe super.updateDrawState il ne sera pas exécuté.

Tous les formats de texte déjà présents dans spannableString seront préservées.

0voto

ANURAG RASTOGI Points 1

Si vous ne voulez pas d'attributs pré-appliqués, n'appelez pas super.updateDrawState() . En surchargeant updateDrawState(object:Textpaint) à l'aide de la fonction objet vous pouvez appliquer ou appeler différentes fonctions présentes dans Text Paint.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X