web-dev-qa-db-fra.com

Android: Linify TextView

J'ai TextView que j'ai besoin de le lier. Voici ce que je fais ..

TextView text = (TextView) view.findViewById(R.id.name);
text.setText("Android...Update from Android");
Pattern pattern = Pattern.compile("Android");
String scheme = "www.Android.com";
Linkify.addLinks(text, pattern, scheme);

La vue textuelle est affichée correctement avec le texte "Android ... Mise à jour de Android", mais je suis confronté à deux problèmes.

1) Ma chaîne de texte a deux instances de la chaîne "Android". Donc, les deux texte sont liés. Je veux seulement que la première occurrence soit liée. Comment devrais-je y aller?

2) Lorsque je clique sur le texte Linkfy, il ouvre le navigateur, mais l'URL est bizarre. L'URL tente d'ouvrir est "www.comandroid". Je ne sais pas ce qui ne va pas mal ici. Le texte "Android" de l'URL est en cours de remplacement. Est-ce que je fais quelque chose de mal lors de la liaison du texte.

Toute aide sera grandement appréciée.

27
Faheem Kalsekar

Le moyen facile est mis de manière automatique dans la mise en page XML.

  Android:autoLink="web" 
22
Fernando JS

J'ai créé une méthode statique qui le fait simplement:

/**
 * Add a link to the TextView which is given.
 * 
 * @param textView the field containing the text
 * @param patternToMatch a regex pattern to put a link around
 * @param link the link to add
 */
public static void addLink(TextView textView, String patternToMatch,
        final String link) {
    Linkify.TransformFilter filter = new Linkify.TransformFilter() {
        @Override public String transformUrl(Matcher match, String url) {
            return link;
        }
    };
    Linkify.addLinks(textView, Pattern.compile(patternToMatch), null, null,
            filter);
}

Et l'OP pourrait l'utiliser simplement:

addLink(text, "^Android", "http://www.Android.com");
19
Shawn Lauzon

Je n'ai pas beaucoup d'expérience avec Linkify. Jusqu'à présent, tout ce que j'ai voulu faire, c'est faire des URL dans le texte dans des liens qui sont traités automatiquement par une version différente de addLinks.

Cependant, l'expression régulière que vous utilisez pour correspondre sur "Android" peut être modifiée pour ne correspond à celle qui commence la chaîne en modifiant votre expression régulière:

Pattern pattern = Pattern.compile("^Android");

Notez l'ajout de '^'. Cela indique à l'expression régulière de correspondre uniquement au modèle "Android" lorsqu'il commence la chaîne. Si cela fonctionnera avec vos chaînes, alors super. Si vous avez d'autres cas, vous étiez le mot que vous souhaitez lier, ce n'est pas au début de la ligne, vous devrez explorer d'autres expressions régulières. Je recommande ce site pour en savoir plus régulier-expressions.info

9
Ian Leslie

Si vous souhaitez ouvrir toutes les URL contenant dans le texte, vous pouvez le faire ..

            TextView textview=(TextView)findViewById(R.id.text);

    textview.setText("Android....Update from Android...www.Android.com");
    Linkify.addLinks(textview, Linkify.WEB_URLS);
    textview.setMovementMethod(LinkMovementMethod.getInstance());

Cela peut fonctionner pour toutes les URL.

8
ankita gahoi

Ici de la réponse à Shawns et le commentaire de Spunkerbaba, je suis sorti de cette classe d'assistance. Cela empêche la question de la double annexe de ce que vous modifiez d'être ajouté à votre URL.

package com.your.package;

public class Linkify {

    /**
     * @param textView
     *            textView who's text you want to change
     * @param linkThis
     *            a regex of what text to turn into a link
     * @param toThis
     *            the url you want to send them to
     */
    public static void addLinks(TextView textView, String linkThis, String toThis) {
        Pattern pattern = Pattern.compile(linkThis);
        String scheme = toThis;
        Android.text.util.Linkify.addLinks(textView, pattern, scheme, new MatchFilter() {
            @Override
            public boolean acceptMatch(CharSequence s, int start, int end) {
                return true;
            }
        }, new TransformFilter() {

            @Override
            public String transformUrl(Matcher match, String url) {
                return "";
            }
        });
    }

}

USEAGE:

 Linkify.addLinks(profileTextView, "BlundellApps.com", "http://www.BlundellApps.com");
3
Blundell

Je pense que ce dont vous avez vraiment besoin, c'est quelque chose d'aussi simple que:

final TextView textView = ((BodyViewHolder) holder).textView;
textView.setText(text);
Linkify.addLinks(textView, Linkify.WEB_URLS); // I would do this only during view creation, btw.

Vous suivez une URL spécifiquement. Certaines personnes suggèrent d'utiliser linkigy.Tous, mais vous ne le voulez pas:

public static final int ALL = WEB_URLS | EMAIL_ADDRESSES | PHONE_NUMBERS | MAP_ADDRESSES;

En outre, d'autres personnes suggèrent d'ajouter:

textview.setMovementMethod(LinkMovementMethod.getInstance());

après avoir ajouté les règles de lien, mais addLinks le fait déjà cela dans son intérieur ;-)

À votre santé!

1
cesards

Pour Koltin avec expression de Lambda, ce serait comme ça

val pattern = Pattern.compile(link.title)
Linkify.addLinks(view, pattern, null, null, { matcher, url -> link.href })
1
Kit
TextView noteView = (TextView) findViewById(R.id.noteview);
noteView.setText(someContent);
Linkify.addLinks(noteView, Linkify.ALL);
0
Arpit Patel

Problème résolu. La solution au premier problème est la réponse fournie par Ian Leslie. La solution au deuxième problème est comme suit.Le comportement de l'API "Linify.AddDLinks" est tel que, il ajoute la chaîne que vous souhaitez connaître à la fin de l'URL. Pour EX..Si vous voulez que vous souhaitez linifier le texte "Android" avec "www.android.com". L'URL finale est "www.android.comandroid" ce qui n'est pas ce dont j'avais besoin. Je suis utilisé

public static final void addLinks (TextView text, Pattern p, String scheme, Linkify.MatchFilter matchFilter, Linkify.TransformFilter transformFilter)
TransformFilter transformFilter = new TransformFilter() {
public final String transformUrl(final Matcher match, String url) { 
return ""; 
} }; 

L'API TransformFilter renvoie une chaîne nulle. Alors mon URL finale est "www.android.com"

0
Faheem Kalsekar