Je rend actuellement une entrée HTML dans un TextView comme ceci:
tv.setText(Html.fromHtml("<a href='test'>test</a>"));
Le HTML affiché m'est fourni via une ressource externe, donc je ne peux pas changer les choses comme je le ferai, mais je peux, bien sûr, faire des regex falsifier le HTML, pour changer la valeur href, par exemple, en autre chose.
Ce que je veux, c'est pouvoir gérer un clic sur un lien directement à partir de l'application, plutôt que d'avoir le lien ouvrir une fenêtre de navigateur. Est-ce réalisable du tout? Je suppose qu'il serait possible de définir le protocole de la valeur href sur quelque chose comme "myApp: //", puis d'enregistrer quelque chose qui permettrait à mon application de gérer ce protocole. Si c'est effectivement le meilleur moyen, j'aimerais savoir comment cela est fait, mais j'espère qu'il existe un moyen plus simple de dire simplement: "lorsqu'un lien est cliqué dans cette vue de texte, je souhaite déclencher un événement qui reçoit la valeur href du lien comme paramètre d'entrée "
Réponses:
Pour en venir à cela presque un an plus tard, il y a une manière différente dont j'ai résolu mon problème particulier. Puisque je voulais que le lien soit géré par ma propre application, il existe une solution un peu plus simple.
Outre le filtre d'intention par défaut, je laisse simplement mon activité cible écouter les
ACTION_VIEW
intentions, et plus particulièrement celles avec le schémacom.package.name
Cela signifie que les liens commençant par
com.package.name://
seront gérés par mon activité.Il ne me reste donc qu'à construire une URL contenant les informations que je souhaite transmettre:
Dans mon activité cible, je peux récupérer cette adresse:
Dans mon exemple, je pourrais simplement vérifier
data
les valeurs nulles, car chaque fois qu'elle n'est pas nulle, je saurai qu'elle a été invoquée au moyen d'un tel lien. De là, j'extrais les instructions dont j'ai besoin de l'url pour pouvoir afficher les données appropriées.la source
getData
vous donne l'URI complet, vous pouvez également utilisergetDataString
qui donne une représentation textuelle. Dans tous les cas, vous pouvez construire l'URL de manière à contenir toutes les données dont vous avez besoincom.package.name://my-action/1/2/3/4
, et vous pouvez extraire les informations de cette chaîne.Uri data = getIntent().getData();
? Je continue de recevoir desActivity not found to handle intent
erreurs. - MerciUne autre façon, emprunte un peu à Linkify mais vous permet de personnaliser votre prise en main.
Classe de portée personnalisée:
Fonction d'assistance:
Usage:
la source
s'il y a plusieurs liens dans la vue texte. Par exemple, textview a "https: //" et "tel no", nous pouvons personnaliser la méthode LinkMovement et gérer les clics pour les mots en fonction d'un modèle. Vous trouverez ci-joint la méthode de mouvement de lien personnalisée.
Cela doit être appelé à partir de la vue de texte de la manière suivante:
la source
widget.getContext()
place.Voici une solution plus générique basée sur la réponse @Arun
Pour l' utiliser juste la mise en œuvre
onLinkClick
de laTextViewLinkHandler
classe. Par exemple:la source
c'est très simple, ajoutez cette ligne à votre code:
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 cela t'aides! Vous pouvez trouver le code ici .
la source
Juste pour partager une solution alternative en utilisant une bibliothèque que j'ai créée. Avec Textoo , cela peut être réalisé comme:
Ou avec une source HTML dynamique:
la source
pour qui cherche plus d'options en voici une
RESSOURCE: CodePath
la source
la source
J'ai changé la couleur de TextView en bleu en utilisant par exemple:
dans le fichier xml. Comment le faire souligner est expliqué ici .
Ensuite, utilisez sa propriété onClick pour spécifier une méthode (je suppose que vous pourriez l'appeler
setOnClickListener(this)
autrement), par exemple:Dans cette méthode, je peux faire ce que je veux comme d'habitude, comme lancer une intention. Notez que vous devez toujours faire la
myTextView.setMovementMethod(LinkMovementMethod.getInstance());
chose normale , comme dans la méthode onCreate () de votre activité.la source
Cette réponse prolonge l'excellente solution de Jonathan S:
Vous pouvez utiliser la méthode suivante pour extraire des liens du texte:
Cela peut être utilisé pour supprimer l'un des paramètres de la
clickify()
méthode:Quelques modifications apportées au ClickSpan:
Vous pouvez maintenant simplement définir le texte sur TextView, puis y ajouter un écouteur:
la source
La meilleure façon dont j'ai utilisé et cela a toujours fonctionné pour moi
la source
Exemple: Supposons que vous ayez défini du texte dans textview et que vous souhaitiez fournir un lien sur une expression de texte particulière: "Cliquez sur #facebook vous amènera à facebook.com"
Dans la mise en page xml:
En activité:
Créez également un fournisseur de balises comme:
Dans le fichier manifeste, faites comme entrée pour le fournisseur et l'activité de test comme:
Maintenant, lorsque vous cliquez sur #facebook, il invoquera testactivtiy. Et dans l'activité de test, vous pouvez obtenir les données comme:
la source