Question Comment puis-je rendre les liens dans un TextView cliquables?


J'ai la TextView définie suivante:

<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 contenant <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 le 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 un peu dommage parce que je préfèrerais montrer un lien texte plutôt que d'afficher l'URL complète.


819
2018-04-29 01:41


origine


Réponses:


Enfouie 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 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:text="@string/txtCredits"/>

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

Important: N'oubliez pas d'enlever autoLink="web" si vous appelez setMovementMethod().


1088
2018-04-30 18:18



J'utilise seulement android:autoLink="web" et ça marche bien. Un clic sur le lien ouvre le navigateur et affiche la bonne page.

Une chose que je pourrais deviner 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.


459
2018-04-29 07:13



Après avoir passé du temps avec ça, j'ai constaté que:

  • android:autoLink="web" fonctionne si vous avez des liens complets dans votre code HTML. Les éléments suivants seront surlignés 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()); travaillera avec ce qui suit (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 étiquettes) elle-même n'est pas un lien. android:autoLink="web" Est-ce que NE PAS travailler avec de tels liens.

  • android:autoLink="web" si défini en XML va remplacer 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'avez pas android:autoLink="web" dans votre mise en page XML si vous voulez tout les liens doivent être cliquables.


294
2017-12-17 23:45



Les solutions ci-dessus n'ont pas fonctionné pour moi, mais ce qui suit (et il semble un peu plus propre).
Tout d'abord, dans la ressource de chaîne, définissez vos chevrons d'ouverture de balise en utilisant le codage d'entité HTML, à savoir:

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

et pas:

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

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

Ensuite (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, pas de regex ou d'autres hacks manuels requis.


84
2018-04-12 13:58



Si vous voulez ajouter un lien de type HTML, tout ce que vous devez faire est:

  • 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 avec aucune configuration spécifique au lien:

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

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

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


56
2018-06-29 10:10



Je l'ai utilisé simplement

Linkify.addLinks(TextView, Linkify.ALL);

rend les liens cliquables donné ici


56
2018-03-26 13:00



J'ai ajouté cette ligne à la 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:support@cleverfinger.com.au?Subject=Lost%20Password" target="_top">support@cleverfinger.com.au</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>

41
2018-06-18 06:14