Android:Linkify TextView

时间:2011-01-20 11:02:08

标签: android linkify

我有textview,我需要链接。这就是我在做什么..

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);

文本视图显示正确,文字为“Android ... Android更新”,但我遇到两个问题。

1)我的文本字符串有两个字符串“Android”的实例。所以,这两个文本都是链接的。我只希望第一次出现链接。我应该怎么做呢?

2)当我点击linkfy文本时,它会打开浏览器,但URL很奇怪。它试图打开的网址是“www.comandroid”。我不知道这里出了什么问题。 URL中的文本“android”正在被替换。链接文本时,我是否做错了。

任何帮助都将受到高度赞赏。

8 个答案:

答案 0 :(得分:21)

简单的方法是将autoLink置于XML布局中。

  android:autoLink="web" 

答案 1 :(得分:19)

我创建了一个简单的静态方法:

/**
 * 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);
}

OP可以简单地使用它:

addLink(text, "^Android", "http://www.android.com");

答案 2 :(得分:9)

我对Linkify没有多少经验。到目前为止,我想要做的就是将文本中的网址设为链接,这些链接由不同版本的addLinks自动处理。

但是,用于匹配“Android”的正则表达式可以更改为仅匹配通过调整正则表达式启动字符串的正则表达式:

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

注意添加'^'。这告诉正则表达式匹配器在启动字符串时仅匹配模式“Android”。如果这对你的琴弦起作用那么好。如果您有其他情况,您要链接的单词不在行的开头,则需要更多地探索正则表达式。我建议此网站了解更多regular-expressions.info

答案 3 :(得分:7)

如果你想打开文本中包含的所有网址,那么你可以这样做..

            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());

它可能适用于所有网址。

答案 4 :(得分:3)

这里来自Shawns回答和SpunkerBaba的评论我已经推出了这个助手类。这样可以解决您要更改的内容的双重追加问题。

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 "";
            }
        });
    }

}

用途:

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

答案 5 :(得分:1)

我认为你真正需要的是一件简单的事情:

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

您正在专门跟踪网址。有些人建议使用Linkigy.ALL,但你不希望这样:

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

此外,其他人建议添加:

textview.setMovementMethod(LinkMovementMethod.getInstance());

添加链接规则后,addLinks已在其内部执行此操作; - )

干杯!

答案 6 :(得分:1)

对于具有lambda表达式的Koltin,它就像这样

val pattern = Pattern.compile(link.title)
Linkify.addLinks(view, pattern, null, null, { matcher, url -> link.href })

答案 7 :(得分:0)

问题解决了。第一个问题的解决方案是Ian Leslie提供的答案。第二个问题的解决方案如下.API“L​​inkify.addLinks”的行为是这样的,它将您要链接的字符串追加到URL的末尾。例如,如果您想将“Android”与“www.android.com”链接起来。最终的URL是“www.android.comAndroid”,这不是我需要的。所以我用过

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 ""; 
} }; 

api transformFilter返回一个空字符串。所以我的最终网址是“www.android.com”