Comment faire des liens dans un TextView cliquable?

1004

J'ai le TextView suivant défini:

<TextView android:layout_width="wrap_content"
    android:layout_height="wrap_content" android:text="@string/txtCredits"
    android:autoLink="web" android:id="@+id/infoTxtCredits"
    android:layout_centerInParent="true"
    android:linksClickable="true"></TextView>

@string/txtCreditsest une ressource de chaîne qui contient <a href="some site">Link text</a>.

Android met en évidence les liens dans TextView, mais ils ne répondent pas aux clics. Quelqu'un peut-il me dire ce que je fais mal? Dois-je définir un onClickListener pour TextView dans mon activité pour quelque chose d'aussi simple que cela?

On dirait que cela a à voir avec la façon dont je définis ma ressource de chaîne. Cela ne fonctionne pas:

<string name="txtCredits"><a href="http://www.google.com">Google</a></string>

Mais cela fait:

<string name="txtCredits">www.google.com</string>

Ce qui est décevant car je préfère de loin afficher un lien texte plutôt que l'URL complète.

Richard
la source
67
android: autoLink = "web" c'est la ligne principale qui doit être ajoutée au xml et cela fonctionne comme un charme. merci @Richard
jeet.chanchawat
1
<string name = "txtCredits"> <a href=" google.com"> www.google.com </a> </ string > utilisez la chaîne ci-dessus et cela fonctionne. On apprend que la chaîne en href et avec en balise d'ancrage doit être la même et avoir .com ou. * Pour fonctionner, il faut vérifier pourquoi
Shaik Khader
<string name = "txtCredits"> Du texte ici <a href=" google.com"> Google </a> </ string > Pour l'extrait ci-dessus Cliquez sur Certains textes ici ne devraient pas fonctionner dans mon cas, que dois-je faire?
Ajay Takur
android:focusable="true"résolu mon problème
Khang .NT

Réponses:

1228

Enterré dans les démos de l'API, j'ai trouvé la solution à mon problème:

Link.java:

    // text2 has links specified by putting <a> tags in the string
    // resource.  By default these links will appear but not
    // respond to user input.  To make them active, you need to
    // call setMovementMethod() on the TextView object.

    TextView t2 = (TextView) findViewById(R.id.text2);
    t2.setMovementMethod(LinkMovementMethod.getInstance());

J'ai supprimé la plupart des attributs de mon TextView pour correspondre à ce qui était dans la démo.

<TextView
    android:id="@+id/text2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/txtCredits"/>

Cela l'a résolu. Assez difficile à découvrir et à réparer.

Important : n'oubliez pas de supprimer autoLink="web"si vous appelez setMovementMethod().

Richard
la source
19
C'est peut-être juste moi, mais pourquoi feriez-vous cela avec un EditText?
Justin
1
Il s'avère que seul setMovementMethod est nécessaire pour atteindre l'objectif.
superarts.org
3
À titre de commentaire, j'ai vu certains Samsung Galaxy S3 avec OS 4.3 qui se bloquent lorsque le "setMovementMethod (LinkMovementMethod.getInstance ())" est utilisé, alors il suffit de prendre cela en compte, j'ai dû créer une validation avant de l'ajouter
Jorge Aguilar
40
Pareil ici. Notez que si setMovementMethod () est appelé, il est nécessaire de supprimer autolink = "web" dans le fichier XML, sinon le lien ne fonctionnera pas. Merci pour le commentaire
voghDev
6
Utilisez simplement l'attribut "autoLink" dans votre xml pour par exemple: android: autoLink = "web"
Kalpesh
533

J'utilise uniquement android:autoLink="web"et cela fonctionne bien. Un clic sur le lien ouvre le navigateur et affiche la bonne page.

Une chose que je pourrais deviner, c'est qu'une autre vue est au-dessus du lien. Quelque chose de transparent remplit tout le parent mais n'affiche rien au-dessus du lien. Dans ce cas, le clic va à cette vue au lieu du lien.

Janusz
la source
3
Ajouté plus d'informations ci-dessus. Serait-ce la façon dont je définis la chaîne comme <string name = "txtCredits"> <a href=" google.com"> Google </a> </ string >? On dirait que c'est autorisé mais ça ne marche pas pour moi.
Richard
6
si vous utilisez linkify auto, vous n'avez pas besoin de la partie a href. Le système d'exploitation prendra la chaîne l'analyser pour les URL et convertit chaque URL en un lien cliquable. Mais cela n'entraînera pas le lien entre le mot google et google.com. Il afficherait www.google.com sous forme de lien.
Janusz
utiliser le lien automatique fonctionne parfaitement pour moi aussi, une visualisation de texte simple sans parent du tout.
euther
2
android: autoLink fonctionne également très bien pour lier des numéros de téléphone, des adresses et des adresses e-mail (ou toutes les réponses ci-dessus).
CloudyMusic
54
Non, ce n'est pas le cas, car cette réponse ne fonctionne pas si vous ne souhaitez pas utiliser une balise d'ancrage avec un texte d'affichage différent de l'URL
cprcrack
375

Après avoir passé un peu de temps avec cela, j'ai constaté que:

  • android:autoLink="web"fonctionne si vous avez des liens complets dans votre code HTML. Les éléments suivants seront mis en évidence en bleu et cliquables:
  • Du texte <a href="http://www.google.com">http://www.google.com</a>
  • Du texte http://www.google.com
  • view.setMovementMethod(LinkMovementMethod.getInstance()); fonctionnera avec les éléments suivants (sera mis en évidence et cliquable):
  • Du texte <a href="http://www.google.com">http://www.google.com</a>
  • Du texte http://www.google.com
  • Du texte <a href="http://www.google.com">Go to Google</a>

Notez que la troisième option a un lien hypertexte, mais la description du lien (la partie entre les balises) elle-même n'est pas un lien. android:autoLink="web"ne fonctionne PAS avec de tels liens.

  • android:autoLink="web"s'il est défini en XML, il remplacera view.setMovementMethod(LinkMovementMethod.getInstance());(c'est-à-dire que les liens du troisième type seront mis en évidence, mais pas cliquables).

La morale de l'histoire est l'utilisation view.setMovementMethod(LinkMovementMethod.getInstance());dans votre code et assurez-vous que vous n'en avez pas android:autoLink="web"dans votre mise en page XML si vous voulez que tous les liens soient cliquables.

Jeshurun
la source
setMovementMethod ne fonctionne pas avec la deuxième option que vous avez mentionnée, c'est-à-dire google.com .. une mise à jour?
Darpan
16
Merci d'avoir signalé que <a href="http://www.google.com">Go to Google</a>cela ne fonctionnera pas pour autoLink. Pour tant de réponses sur SO, c'est la seule qui l'a mentionné. Je vous remercie!
cwhsu
Celui-ci fonctionne. Testé sur API 29.
Wrichik Basu
96

Les solutions ci-dessus n'ont pas fonctionné pour moi, mais les suivantes l'ont fait (et cela semble un peu plus propre).
Tout d'abord, dans la ressource de chaîne, définissez vos chevrons d'ouverture de balise à l'aide du codage d'entité HTML, c'est-à-dire:

&lt;a href="http://www.google.com">Google&lt;/a>

et pas:

<a href="http://www.google.com">Google</a>

En général, encodez tous les chevrons de la chaîne comme ça. BTW, le lien doit commencer parhttp://

Puis (comme suggéré ici ) définissez cette option sur votre TextView:

 android:linksClickable="true"

Enfin, dans le code, faites:

((TextView) findViewById(R.id.your_text_view)).setMovementMethod(LinkMovementMethod.getInstance());
((TextView) findViewById(R.id.your_text_view)).setText(Html.fromHtml(getResources().getString(R.string.string_with_links)));

C'est tout, aucune regex ou autre piratage manuel requis.

Błażej Czapp
la source
7
Cela créera un analyseur HTML à chaque exécution de ce code. Soyez conscient de cela si vous l'utilisez pour créer des liens à l'intérieur d'un élément de liste ou à d'autres endroits critiques pour les performances de votre application. Lors de la création d'un listitem, cela augmente le temps d'exécution de mes méthodes getView de 50%
Janusz
1
Notez également que les espaces dans l'URL doivent être remplacés par%20
Nicolas Tyler
Vous pouvez éviter les problèmes de codage d'entité en enveloppant votre chaîne dans la <![CDATA[ ... ]]>balise.
Paul Lammertsma
1
FONCTIONNE pour moi, merci. Ne fonctionne pas avec la <![CDATA[...]]>balise.
ricky.tribbia
Ça devrait être la réponse! A parfaitement fonctionné avec mon application native
Ajay Kulkarni
69

j'ai utilisé ça simplement

Linkify.addLinks(TextView, Linkify.ALL);

rend les liens cliquables donnés ici

jai_b
la source
4
Cette réponse est la meilleure. Fonctionne sur toutes les versions d'Android et nous avons juste besoin d'ajouter cette méthode lorsque le texte est défini dans TextView. Bonus: il nous permet d'ajouter des liens personnalisables cliquables
Kerwan
3
Vraiment la plus simple et la meilleure réponse. cela fonctionne pour le courrier électronique / web en même temps .... merci mec !!!
Imran Ahmed
1
Utilisez LinkifyCompat si vous avez besoin de certaines des fonctionnalités avancées les plus récentes
Vaiden
Bon, ça fait des urls sans <a href...cliquable
Pavel
Il fait également fonctionner toutes les balises "html" à l'intérieur en conséquence, par exemple <b> ... </b> etc.
Tableau
67

Si vous souhaitez ajouter un lien de type HTML, il vous suffit de:

  • ajouter une chaîne de type HTML de ressource:

     <string name="link"><a href="https://www.google.pl/">Google</a></string>
  • ajoutez votre vue à la mise en page sans aucune configuration spécifique au lien:

     <TextView
        android:id="@+id/link"
        android:text="@string/link" />`
  • ajoutez le MovementMethod approprié par programme à votre TextView:

     mLink = (TextView) findViewById(R.id.link);
     if (mLink != null) {
       mLink.setMovementMethod(LinkMovementMethod.getInstance());
     }

C'est ça! Et oui, avoir des options comme "autoLink" et "linksClickable" travaillant uniquement sur des liens explicites (non enveloppés dans des balises html) est très trompeur pour moi aussi ...

vizZ
la source
2
+1 Vous avez raison. Il devrait y avoir une option pour entrer un motif vous-même afin qu'il corresponde. De cette façon, c'est assez stupide.
schlingel
47

J'ai ajouté cette ligne à TextView: android:autoLink="web"
Voici un exemple d'utilisation dans un fichier de mise en page.

layout.xml échantillon

    <TextView
        android:id="@+id/txtLostpassword"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:autoLink="email"
        android:gravity="center"
        android:padding="20px"
        android:text="@string/lostpassword"
        android:textAppearance="?android:attr/textAppearanceSmall" />

    <TextView
        android:id="@+id/txtDefaultpassword"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:autoLink="web"
        android:gravity="center"
        android:padding="20px"
        android:text="@string/defaultpassword"
        android:textAppearance="?android:attr/textAppearanceSmall" />

string.xml

<string name="lostpassword">If you lost your password please contact <a href="mailto:[email protected]?Subject=Lost%20Password" target="_top">[email protected]</a></string>

<string name="defaultpassword">User Guide <a href="http://www.cleverfinger.com.au/user-guide/">http://www.cleverfinger.com.au/user-guide/</a></string>
Shanewaj
la source
36

Ce qui suit devrait fonctionner pour toute personne qui recherche une combinaison de texte et d'hyperlien dans une application Android.

Dans string.xml:

<string name="applink">Looking for Digital Visiting card? 
<a href="https://play.google.com/store/apps/details?id=com.themarkwebs.govcard">Get it here</a>
</string>

Maintenant, vous pouvez l'utiliser stringdans n'importe quelle donnée Viewcomme celle-ci:

<TextView
    android:id="@+id/getapp"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:gravity="center"
    android:textColor="@color/main_color_grey_600"
    android:textSize="15sp"
    android:text="@string/applink"/>

Maintenant, dans votre activité ou fragment, procédez comme suit:

TextView getapp =(TextView) findViewById(R.id.getapp);
getapp.setMovementMethod(LinkMovementMethod.getInstance());

À l'heure actuelle, vous n'avez pas besoin de définir android:autoLink="web"ou d' android:linksClickable="true"utiliser cette approche.

J'espère que vous trouverez cela utile.

Asesha George
la source
Cela fonctionne bien, mais lorsque vous appuyez à nouveau sur le Web ouvert, fermez uniquement le navigateur, mais ne revenez pas à l'application.
Jachumbelechao Unto Mantekilla
27

J'espère que cela t'aidera;

String value = "<html>Visit my blog <a href=\"http://www.maxartists.com\">mysite</a> View <a href=\"sherif-activity://myactivity?author=sherif&nick=king\">myactivity</a> callback</html>";
    TextView text = (TextView) findViewById(R.id.text);


    text.setText(Html.fromHtml(value));
    text.setMovementMethod(LinkMovementMethod.getInstance());
Bebin TN
la source
3
Cela fonctionne très bien. Assurez-vous également que vous supprimez android:autoLink=?de votre TextView.
sulai
C'est ce qui a finalement fonctionné pour moi. Un code HTML valide et ne pas utiliser android:autoLink=?est important!
Neal Sanche
Pour Xamarin, le mot s'affiche mais n'est pas souligné et ne peut pas être cliqué à l'aide des paramètres ci-dessus et NON de ces paramètres: autoLink, linksClickable
maxweber
Pour Xamarin, la définition de ceux-ci et la définition de Text ou la définition de TextFormatted donne également le mot mais ce n'est pas cliquable ni bleu / souligné. La suppression de l'autoLink échoue également. La suppression des liens uniquement ClickClick échoue également. La suppression des deux échoue également.
maxweber
helloWorld.TextFormatted = Html.FromHtml (linkURL); avec et sans ceux-ci échoue également. (non lié, pas bleu, ne peut pas être cliqué)
maxweber
25

Seulement de quoi avez-vous besoin pour l'ajouter en mode texte en xml

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:autoLink="web"/>
Ahmed Mostafa
la source
24

La chose la plus simple qui a fonctionné pour moi est d'utiliser Linkify

TextView txt_Message = (TextView) view.findViewById(R.id.txt_message);
txt_Message.setText("This is link https://www.google.co.in/");
Linkify.addLinks(txt_Message, Linkify.WEB_URLS);

et il détectera automatiquement les URL Web du texte dans la vue de texte.

pks
la source
Certes, mais ils ne seront pas cliquables.
FractalBob
Les liens sont cliquables.
Octavian Ionel
19

Richard, la prochaine fois, vous devriez ajouter ce code sous TextView à la mise en page XML à la place.

android:autoLink="all"

Cela devrait être comme ça.

<TextView 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" 
    android:text="@string/txtCredits"
    android:id="@+id/infoTxtCredits"
    android:autoLink="all"
    android:linksClickable="true">
</TextView>

Vous n'avez pas besoin d'utiliser ce code ( t2.setMovementMethod(LinkMovementMethod.getInstance());) pour rendre le lien cliquable.

En outre, voici la vérité: tant que vous définissez l' autoLink et le linksClickable , n'oubliez pas d'ajouter ceci dans le fichier String.xml pour que le lien cliquable fonctionne.

<string name="txtCredits"><a href="http://www.google.com">Google</a></string>
David Dimalanta
la source
3
Ça ne marche pas pour moi. Le lien est en effet cliquable, mais la chaîne entière est affichée, pas seulement "Google". En fait, aucune des réponses ici ou une combinaison de celles-ci ne fonctionne jusqu'à présent.
Violet Giraffe
Votre appareil ou émulateur est-il activé sur Internet et réglez-le sur ON (wifi) ou avez-vous connecté un LAN, @Violet Giraffe?
David Dimalanta
C'est. Je n'ai jamais réussi à rendre les liens cliquables en utilisant uniquement des attributs XML, j'ai dû recourir au code Java pour cela. Ce qui n'est pas grave, mais pas sympa.
Violet Giraffe
18

en utilisant linkify : Linkify prend un morceau de texte et une expression régulière et transforme toutes les correspondances d'expression régulière dans le texte en liens cliquables

TextView textView = (TextView) findViewById(R.id.textView);
textView.setText("http://www.domain.com");
Linkify.addLinks(textView, Linkify.WEB_URLS);

N'oubliez pas

import android.widget.TextView;
DeathRs
la source
16

Voici le code Android d'une seule ligne pour rendre le téléphone et l'URL sélectionnables à partir de TextView, peu importe ce qui est une chaîne et ce qui est des données. Vous n'avez pas besoin d'utiliser de balises HTML pour cela.

TextView textView = (TextView)findViewById(R.id.textView1);
textView.setText("some url is www.google.com phone 7504567890 another url lkgndflg.com ");

// Makes the textView's Phone and URL (hyperlink) select and go.
Linkify.addLinks(textView, Linkify.WEB_URLS | Linkify.PHONE_NUMBERS);
Rahul Raina
la source
13

J'ai remarqué qu'en utilisant android:autoLink="web"ainsi

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content" 
    android:autoLink="web"/>

a bien fonctionné pour les URL mais comme j'avais une adresse e-mail et un numéro de téléphone que je voulais également lier, j'ai fini par utiliser cette ligne android:autoLink="all"comme ceci

<TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content" 
        android:autoLink="all"/>

Et ça a fonctionné comme un charme.

aLearner
la source
13

Gérer également la couleur du texte Linkify entrez la description de l'image ici

tv_customer_care_no.setLinkTextColor(getResources().getColor(R.color.blue));
  tv_customer_care_no.setText("For us to reach out to you, please fill the details below or contact our customer care at  18004190899 or visit our website http://www.dupont.co.in/corporate-links/contact-dupont.html ");
   Linkify.addLinks(tv_customer_care_no, Linkify.WEB_URLS | Linkify.PHONE_NUMBERS);
   Linkify.addLinks(tv_customer_care_no, Linkify.ALL );
Keshav Gera
la source
11

Assurez-vous de ne pas l' utiliser setAutoLinkMask(Linkify.ALL)lorsque vous utilisez setMovementMethod(LinkMovementMethod.getInstance())et Html.fromHTML()sur des HTMLliens correctement formatés (par exemple, <a href="http://www.google.com/">Google</a>).

onze ans
la source
10

Utilisez ceci...

TextView.setOnClickListener(new OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        // TODO Auto-generated method stub
                        Intent in=new Intent(Intent.ACTION_VIEW,Uri.parse("http://www.twitter.com/"));
                        startActivity(in);
                    }

                });

et ajouter une autorisation dans le fichier manifeste

<uses-permission android:name="android.permission.INTERNET"/>
Tej
la source
1
Cela fonctionnera, mais gardez à l'esprit que l'application peut ne pas avoir besoin d'une autorisation Internet au-delà de cette TextView cliquable. Peut-être exagéré dans ces cas
Jose_GD
2
Est-ce vraiment lié à la question?
Darpan
2
Ce n'était pas pertinent pour la question.
afollestad
1
Cela n'échouera jamais!
Skynet
J'aime cette méthode car elle nous permet d'avoir juste le texte d'ancrage plutôt que l'URL complète. Le texte d'ancrage peut également être stylisé, par exemple de couleur verte et souligné.
bébé perdu
10

Vous n'avez besoin que de ceci:

android:autoLink="web"

Insérez cette ligne dans TextView, qui peut être cliquable en référence au Web. Adresse URL définie sous forme de texte de cette TextView.

Exemple:

 <TextView
    android:id="@+id/textViewWikiURL"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textSize="20sp"
    android:textStyle="bold"
    android:text="http://www.wikipedia.org/"
    android:autoLink="web" />
Androdos
la source
10

La réponse acceptée est correcte, MAIS cela signifie que les numéros de téléphone, les cartes, les adresses e-mail et les liens réguliers, par exemple http://google.comsans balises href, NE SERONT PLUS cliquables car vous ne pouvez pas avoir de lien automatique dans le xml.

La seule solution complète pour que TOUT puisse être cliqué que j'ai trouvé est la suivante:

Spanned text = Html.fromHtml(myString);
URLSpan[] currentSpans = text.getSpans(0, text.length(), URLSpan.class);
SpannableString buffer = new SpannableString(text);
Linkify.addLinks(buffer, Linkify.ALL);
for (URLSpan span : currentSpans) {
    int end = text.getSpanEnd(span);
    int start = text.getSpanStart(span);
    buffer.setSpan(span, start, end, 0);
}
textView.setText(buffer);
textView.setMovementMethod(LinkMovementMethod.getInstance());

Et le TextView ne devrait PAS avoir android:autolink. Il n'y a aucun besoin android:linksClickable="true"non plus; c'est vrai par défaut.

Kelly McKinnon
la source
pour moi, cela a fonctionné sans cela, la réponse acceptée a bien fonctionné @ Kelly pouvez-vous dire la version Android et l'appareil sur lequel vous avez rencontré le problème?
Akhil Dad
Ne fonctionne pas pour les myapp://schémas (pour Deep Linking).
CoolMind
7

Voici comment j'ai résolu les liens cliquables et visibles dans une TextView (par code)

private void setAsLink(TextView view, String url){
        Pattern pattern = Pattern.compile(url);
        Linkify.addLinks(view, pattern, "http://");
        view.setText(Html.fromHtml("<a href='http://"+url+"'>http://"+url+"</a>"));
    }
Dominic Bartl
la source
mais je voudrais voir le texte et en cliquant sur le texte, il redirige vers le lien (ouvert par le navigateur)? Cette solution ne résout pas cela, n'est-ce pas?
Duc Tran
6

Utilisez le code ci-dessous:

String html = "<a href=\"http://yourdomain.com\">Your Domain Name</a>"
TextView textview = (TextView) findViewById(R.id.your_textview_id);
textview.setMovementMethod(LinkMovementMethod.getInstance());
textview.setText(Html.fromHtml(html));
Phuc Tran
la source
6

[Tested in Pre-lollipop as well as in Lollipop and above]

Vous pouvez obtenir votre chaîne HTML à partir du backend ou de vos fichiers de ressources. Si vous mettez votre texte en tant que chaîne de ressource, assurez-vous d'ajouter la CDATAbalise:

<string name="your_text">![CDATA[...<a href="your_link">Link Title</a>  ...]]</string>

Ensuite, dans le code, vous devez obtenir la chaîne et l'affecter au format HTML et définir une méthode de déplacement de lien:

String yourText = getString(R.string.your_text);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
   textView.setText(Html.fromHtml(yourText, Html.FROM_HTML_MODE_COMPACT));
} else {
   textView.setText(Html.fromHtml(yourText));
}

try {
   subtext.setMovementMethod(LinkMovementMethod.getInstance());
} catch (Exception e) {
   //This code seems to crash in some Samsung devices.
   //You can handle this edge case base on your needs.
}
Benny
la source
5

La raison pour laquelle vous rencontrez le problème est qu'il essaie uniquement de faire correspondre les adresses "nues". des choses comme "www.google.com" ou " http://www.google.com ".

L'exécution de votre texte via Html.fromHtml () devrait faire l'affaire. Vous devez le faire par programme, mais cela fonctionne.

Jeremy Logan
la source
2
Les liens dans TextView sont d'une couleur différente de celle des autres textes de la chaîne, donc je pense qu'ils sont reconnus comme des liens. Ils ne sont tout simplement pas cliquables :-(
Richard
4

Je ne sais pas si cela vaut la peine d'ajouter une autre réponse, mais juste au cas où ...

J'ai dû traquer cela dans quelques endroits mais j'ai finalement réussi à faire fonctionner cette version du code.

strings.xml:

<string name="name1">&lt;a href="http://www.google.com">link text1&lt;/a></string>
<string name="name2">&lt;a href="http://www.google.com">link text2&lt;/a></string>

myactivity.xml:

<TextView 
    android:id="@+id/textview1"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:layout_marginTop="5dp" />

<TextView 
    android:id="@+id/textview2"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:layout_marginTop="5dp" />

myactivty.java (dans onCreate ()):

TextView tv1 = (TextView)findViewById(R.id.textview1);
TextView tv2 = (TextView)findViewById(R.id.textview2);

tv1.setText(Html.fromHtml(getResources().getString(R.string.name1)));
tv2.setText(Html.fromHtml(getResources().getString(R.string.name2)));
tv1.setMovementMethod(LinkMovementMethod.getInstance());
tv2.setMovementMethod(LinkMovementMethod.getInstance());

Cela va créer deux hyperliens cliquables avec le texte link text1et link text2qui redirigent l'utilisateur vers google.

démagnétiseur
la source
4

Le téléphone Autolink ne fonctionne pas pour moi. Ce qui suit a fonctionné comme un charme,

TextView tv = (TextView) findViewById(R.id.emergencynos);
String html2="<br><br>Fire - <b><a href=tel:997>997</a> </b></br></br>";        
tv.append(Html.fromHtml(html2));
tv.setMovementMethod(LinkMovementMethod.getInstance());
user1995307
la source
4

Si vous utilisez TextView basé sur XML, pour votre besoin, vous devez faire seulement deux choses:

  1. Identifiez votre lien dans la chaîne, par exemple "Ceci est ma page Web". Vous pouvez l'ajouter en xml ou dans le code.

  2. Dans le xml qui a le TextView, ajoutez-les:


android:linksClickable="true"

android:autoLink="web"
codeFood
la source
4

Ajouter CDATA à votre ressource de chaîne

Strings.xml

<string name="txtCredits"><![CDATA[<a href=\"http://www.google.com\">Google</a>]]></string>
Akexorcist
la source
3

J'utilise le lien automatique pour "souligner automatiquement" le texte, mais je viens de créer un "onClick" qui le gère. (J'ai rencontré ce problème moi-même)

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginRight="10dp"
            android:textSize="18dp"
            android:autoLink="all"
            android:text="@string/twitter"
            android:onClick="twitter"/>

public void twitter (View view)
    {
        try
        {
            Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://twitter.com/onaclovtech"));
            startActivity(browserIntent);

        }
        finally
        {
        }
    }

Ne nécessite aucune autorisation, car vous transmettez l'intention aux applications qui gèrent ces ressources (navigateur IE).

C'est ce qui a fonctionné pour moi. Bonne chance.

onaclov2000
la source
Vous ne créez pas un lien cliquable, vous mettez simplement tout le TextView cliquable ... Ce n'est pas la question.
clauziere
D'accord, mais parfois une solution de contournement qui fonctionne, c'est la même chose. Clairement 5 ans après que la réponse la plus populaire ait été écrite, c'était toujours un problème, et cela fait 6 mois que j'ai eu le même problème, mais j'ai fini avec une solution différente mais qui fonctionnait.
onaclov2000
2

Je viens de perdre tellement de temps à comprendre que vous devez utiliser getText (R.string.

Quoi qu'il en soit, voici comment j'ai fait travailler le mien. Avec plusieurs hyperliens dans la même vue texte également.

    TextView termsTextView = (TextView) getActivity().findViewById(R.id.termsTextView);
    termsTextView.append("By registering your account, you agree to our ");
    termsTextView.append(getText(R.string.terms_of_service));
    termsTextView.append(", ");
    termsTextView.append(getText(R.string.fees));
    termsTextView.append(", and the ");
    termsTextView.append(getText(R.string.stripe_connected_account_agreement));

    termsTextView.setMovementMethod(LinkMovementMethod.getInstance());



            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/termsTextView"/>

exemple de chaîne

    <string name="stripe_connected_account_agreement"><a href="https://stripe.com/connect/account-terms">Stripe Connected Account Agreement</a></string>
luca992
la source
C'est tellement plus simple et facile à utiliser. J'ai plusieurs liens avec du texte personnalisé travaillant dans une TextView ajoutée dynamiquement à cause de cela. Cela nécessite le plus de votes positifs possible. Je me suis cassé la tête avec des chaînes étendues, des TextViews personnalisées et des méthodes HtmlCompat.fromHtml. Merci beaucoup @ luca992.
Parth Patel