4
votes

Partie de TextView cliquable avec un lien

J'ai une application avec beaucoup de texte dans strings.xml. Des parties de ce texte sont des hyperliens qui doivent être cliquables.

Maintenant, lorsque j'insère ce texte dans TextView à partir du fichier de mise en page, cela fonctionne, mais lorsque j'essaie d'insérer ce même texte dans le même TextView avec tv.settext (getStrings ...) cela ne fonctionnera pas.

Voici le code:

strings.xml:

<TextView
     android:id="@+id/link_tv"
     android:textColor="@color/privacy_policy_link_text_color"
     android:paddingLeft="@dimen/_5sdp"
     android:paddingRight="@dimen/_5sdp"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"/>

Activité:

TextView txt = findViewById(R.id.link_tv);
txt.setMovementMethod(LinkMovementMethod.getInstance());
txt.setText(getString(R.string.some_text));

activity_main.xml:

<string name="some_text">
For you to see the article, you need to click <a href='http://www.google.com'>this link</a>
\n\n
after that etc...
</string>

Des pensées?


3 commentaires

Pouvez-vous également publier votre mise en page TextView (XML)?


De plus, cela pourrait simplement être la façon dont vous l'avez posté, mais votre TextView est défini comme txt , mais vous utilisez tv Juste en vous assurant de le savoir :)


C'est juste la façon dont je l'ai publié, TextView est appelé différemment dans le projet.


3 Réponses :


-2
votes

Créez 2 affichages de texte dans le fichier de mise en page, l'un pour le texte statique et l'autre pour le texte dynamique, et attribuez le texte dynamique via textView.setText (texte dynamique). J'espère que ça aide ..


0 commentaires

1
votes

vérifiez le point ci-dessous avant de tester

  • Vérifiez que votre lien commence par http: // ou https: //
  • Placez votre chaîne dans une balise CDATA (comme )
  • Vérifiez que vous avez ajouté une autorisation Internet dans votre fichier manifest.xml
  • puis le texte HTML dynamiquement peut être défini en utilisant le code ci-dessous dans textView
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    textView.setText(Html.fromHtml(getString(R.string.html_string), Html.FROM_HTML_MODE_COMPACT));
} else { 
    textView.setText(Html.fromHtml(getString(R.string.html_string)));
}
Linkify.addLinks(textView, Linkify.ALL);
textView.setMovementMethod(LinkMovementMethod.getInstance());


14 commentaires

pour moi, le même code fonctionne très bien txt.setMovementMethod (LinkMovementMethod.getInstance ()); if (Build.VERSION.SDK_INT> = Build.VERSION_CODES.N) {txt.setText (Html.fromHtml (getString (R.string.some_text), Html.FROM_HTML_MODE_COMPACT)); } else {txt.setText (Html.fromHtml (getString (R.string.some_text))); } capture d'écran


avez-vous défini quelque chose dans le xml pour la vue de texte?


J'ai créé une application vide avec un seul TextView pour l'essayer à nouveau et cela ne fonctionne pas. Je ne sais pas pourquoi ...


pouvez-vous partager votre code que vous avez récemment testé et les détails de l'appareil sur lequel vous testez


text = findViewById (R.id.textView); text.setMovementMethod (LinkMovementMethod.getInstance ()); if (Build.VERSION.SDK_INT> = Build.VERSION_CODES.N) {text.setText (Html.fromHtml (getString (R.string.some_text), Html.FROM_HTML_MODE_COMPACT)); } else {text.setText (Html.fromHtml (getString (R.string.some_text))); } text.invalidate (); Pour consulter l'article, vous devez cliquer sur THIS "rel =" nofollow noreferrer "> google .com "> CE LIEN après cela etc ...


essayez ceci, cela devrait fonctionner CE LIEN après ça etc ...]]>


Il s'affiche maintenant sous forme de lien, mais lorsque je clique dessus, il reste simplement sélectionné, il n'ouvre pas la page Web.


testez-vous sur l'émulateur? vérifier s'il y a une application de navigateur installer init


Non, je teste sur Samsung J5 et Huawei P20lite. Ils ont des navigateurs


essayez ce code après avoir mis du texte dans votre textView Linkify.addLinks (txt, Linkify.ALL); txt.setMovementMethod (LinkMovementMethod.getInstance ());


et ajoutez également l'autorisation à votre manifeste


Je reçois un avertissement lorsque je clique sur le lien. Cela n'ouvre pas de page Web. Actvity n'a pas été trouvé pour l'intention, l'intention {act = android.intent.action.VIEW dat = google.com (a des extras)}


Ok, ça marche maintenant. "http: //" était manquant dans la chaîne. Pouvez-vous modifier votre réponse s'il vous plaît? Je vais l'accepter. Je vous remercie.


bravo au fait, c'est tous vos efforts, rien que j'ai fait pour vous mais à des fins d'apprentissage pour les autres utilisateurs, je modifierai ma réponse, merci



0
votes

vous pouvez essayer ceci

   fun setClickableText(view: TextView, firstSpan: String, secondSpan: String) {
    val context = view.context
    val builder = SpannableStringBuilder()
    val unClickableSpan = SpannableString(firstSpan)
    val span = SpannableString(" "+secondSpan)

    builder.append(unClickableSpan);
    val clickableSpan: ClickableSpan = object : ClickableSpan() {
        override fun onClick(textView: View) {
           // ur action here
        }

        override fun updateDrawState(ds: TextPaint) {
            super.updateDrawState(ds)
            ds.isUnderlineText = true
            ds.setTypeface(Typeface.create(Typeface.DEFAULT, Typeface.ITALIC));
        }
    }
    builder.append(span);
    builder.setSpan(clickableSpan, firstSpan.length, firstSpan.length+secondSpan.length+1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)

    view.setText(builder,TextView.BufferType.SPANNABLE)
    view.setMovementMethod(LinkMovementMethod.getInstance());


}


0 commentaires