J'ai un TextView qui rend le HTML de base, contenant plus de 2 liens. Je dois capturer les clics sur les liens et ouvrir les liens - dans ma propre WebView interne (pas dans le navigateur par défaut).
La méthode la plus courante pour gérer le rendu des liens semble être la suivante:
String str_links = "<a href='http://google.com'>Google</a><br /><a href='http://facebook.com'>Facebook</a>";
text_view.setLinksClickable(true);
text_view.setMovementMethod(LinkMovementMethod.getInstance());
text_view.setText( Html.fromHtml( str_links ) );
Cependant, cela provoque l'ouverture des liens dans le navigateur Web interne par défaut (affichant la boîte de dialogue "Terminer l'action avec ...").
J'ai essayé d'implémenter un onClickListener, qui se déclenche correctement lorsque le lien est cliqué, mais je ne sais pas comment déterminer QUEL lien a été cliqué ...
text_view.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
// what now...?
}
});
Alternativement, j'ai essayé de créer une classe LinkMovementMethod personnalisée et d'implémenter onTouchEvent ...
public boolean onTouchEvent(TextView widget, Spannable text, MotionEvent event) {
String url = text.toString();
// this doesn't work because the text is not necessarily a URL, or even a single link...
// eg, I don't know how to extract the clicked link from the greater paragraph of text
return false;
}
Des idées?
Exemple de solution
J'ai proposé une solution qui analyse les liens d'une chaîne HTML et les rend cliquables, puis vous permet de répondre à l'URL.
span.getURL()
".) Vous pouvez même l'afficher comme réponse, car c'est mieux que la réponse actuellement acceptée!Réponses:
Sur la base d' une autre réponse , voici une fonction setTextViewHTML () qui analyse les liens d'une chaîne HTML et les rend cliquables, puis vous permet de répondre à l'URL.
la source
ListView
s lorsqu'unView
defocusable
est réglé vrai. Cela se produit généralement avecButton
s /ImageButton
s. Essayez d'appelersetFocusable(false)
votreTextView
.text.setMovementMethod(LinkMovementMethod.getInstance());
si vous n'utilisez pas URLSpanVous avez fait comme suit:
avez-vous essayé dans l'ordre inverse comme indiqué ci-dessous?
Et sans:
la source
Cela peut être simplement résolu en utilisant Spannable String.Ce que vous voulez vraiment faire (Exigence commerciale) n'est pas clair pour moi, donc le code suivant ne donnera pas une réponse exacte à votre situation, mais je suis peu sûr que cela vous donnera une idée et vous pourrez résoudre votre problème sur la base du code suivant.
Comme vous le faites, j'obtiens également des données via la réponse HTTP et j'ai ajouté du texte souligné supplémentaire dans mon cas "plus" et ce texte souligné ouvrira le navigateur Web sur l'événement de clic. J'espère que cela vous aidera.
la source
J'ai eu le même problème mais beaucoup de texte mélangé avec quelques liens et courriels. Je pense qu'utiliser 'autoLink' est un moyen plus simple et plus propre de le faire:
Vous pouvez définir Linkify.EMAIL_ADDRESSES ou Linkify.WEB_URLS s'il n'y en a qu'un seul que vous souhaitez utiliser ou définir à partir de la mise en page XML
Les options disponibles sont: aucune, Web, e-mail, téléphone, carte, toutes
la source
Solution
J'ai implémenté une petite classe à l'aide de laquelle vous pouvez gérer de longs clics sur TextView lui-même et Taps sur les liens dans TextView.
Disposition
TextViewClickMovement.java
Usage
Liens
J'espère que ça aide! Vous pouvez trouver le code ici .
la source
text_view.setMovementMethod(new TextViewClickMovement(this, context));
; Android Studio se plaint que celacontext
n'a pas pu être résolu.Une solution plus propre et meilleure, utilisant la bibliothèque Linkify native .
Exemple:
la source
J'ai créé une fonction d'extension simple dans Kotlin pour capturer les clics sur les liens URL dans un TextView en appliquant un nouveau rappel aux éléments URLSpan.
strings.xml (exemple de lien dans le texte)
Assurez-vous que votre texte fractionné est défini sur TextView avant d'appeler "handleUrlClicks"
C'est la fonction d'extension:
Voici comment je l'appelle:
la source
Si vous utilisez Kotlin, j'ai écrit une extension simple pour ce cas:
Usage:
la source
Une approche alternative, à mon avis plus simple (pour les développeurs paresseux comme moi;)
Si nécessaire, vous pouvez également vérifier le schéma / type mime de l'intention
la source
Im utilisant uniquement textView, et définissez la durée pour l'url et le clic de poignée.
J'ai trouvé une solution très élégante ici, sans linkify - d'après cela je sais quelle partie de la chaîne je veux linkify
gérer le lien textview cliquer dans mon application Android
à kotlin:
et utilisation: linkify (yourTextView, urlString, context)
la source