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 Réponses :
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 ..
vérifiez le point ci-dessous avant de tester
http: //
ou https: //
) manifest.xml
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());
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 ();
essayez ceci, cela devrait fonctionner
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
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()); }
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.