1160 votes

Comment puis-je faire des liens dans un TextView cliquable?

J'ai le texte suivant TextView définis:

<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/txtCredits est une ressource de chaîne qui contient <a href="some site">Link text</a>.

Android est en soulignant les liens dans le 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 le TextView dans mon activité pour quelque chose d'aussi simple que cela?

Il semblerait qu'il a à voir avec la façon dont je définis mon ressource de chaîne. Cela ne fonctionne pas:

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

Mais ce n':

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

Ce qui est une déception, parce que j'aimerais bien plutôt à un lien de texte que de montrer l'URL complète.

1349voto

Richard Points 6833

Enterré dans l'API des démos, 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 enlevé la plupart des attributs sur 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:layout_below="@+id/imgCredits"
    android:layout_centerInParent="true"
    android:layout_marginTop="20dp"
    android:text="@string/txtCredits"/>

Que résolu. Assez difficile à découvrir et à corriger.

592voto

Janusz Points 52607

Je suis en utilisant seulement android:autoLink="web" et il fonctionne très bien. Un clic sur le lien permet d'ouvrir le navigateur et affiche la bonne page.

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

466voto

Jeshurun Points 7257

Après avoir passé quelque temps avec eux, j'ai trouvé que:

  • android:autoLink="web" fonctionne si vous avez plein de liens dans votre code HTML. Les éléments suivants seront mis en surbrillance en bleu et cliquable:
  • Texte <a href="http://www.google.com">http://www.google.com</a>
  • Texte http://www.google.com
  • view.setMovementMethod(LinkMovementMethod.getInstance()); collaborera avec le suivant (sera mis en évidence et cliquable):
  • Texte <a href="http://www.google.com">http://www.google.com</a>
  • Texte http://www.google.com
  • 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 comprise entre les balises) lui-même n'est pas un lien. android:autoLink="web" ne PAS travailler avec de tels liens.

  • android:autoLink="web" si elle est définie en XML remplacera view.setMovementMethod(LinkMovementMethod.getInstance()); (c'est à dire, les liens du troisième type seront mis en évidence, mais pas cliquable).

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

110voto

Blazej Czapp Points 552

Les solutions ci-dessus ne fonctionne pas pour moi, mais la suite n'a (et il me semble un peu plus propre).
Tout d'abord, dans la chaîne des ressources, définir votre balise d'ouverture des chevrons à l'aide de l'entité HTML de codage, c'est à dire:

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

et non PAS:

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

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

Puis (comme expliqué ici), définissez cette option sur votre TextView:

 android:linksClickable="true"

Enfin, dans le code, n':

((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 ça, pas de regexes ou manuelle des hacks nécessaire.

74voto

vizZ Points 306

Si vous voulez ajouter du code HTML comme lien, tout ce que vous devez faire est de:

  • ajouter une ressource HTML chaîne:

     <string name="link"><a href="https://www.google.pl/">Google</a></string>
    
  • ajouter votre point de vue à la mise en page avec PAS de lien de configuration spécifiques à tous:

     <TextView
        android:id="@+id/link"
        android:text="@string/link" />`
    
  • ajouter des MovementMethod par programmation à votre TextView:

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

Ça y est! Et oui, avoir des options comme "autoLink" et "linksClickable" de travail sur les liens explicites (pas enveloppés dans des balises html) est très trompeur pour moi aussi...

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