Android:Linkify TextView

我有我需要链接的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)我的文本string有两个string“Android”的实例。 所以,这两个文本都是链接的。 我只想要第一次被链接。 我应该怎么做呢?

2)当我点击linkfy文本,它打开浏览器,但url是奇怪的。 它试图打开的url是“www.comandroid”。 我不知道这里有什么问题。 url中的文字“android”正在被replace。 链接文本时我做错了什么?

任何帮助将不胜感激。

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

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

简单的方法是将autoLink放在XML布局中。

  android:autoLink="web" 

我对Linkify没有太多经验。 到目前为止,我所要做的就是将文本中的URL转换为由不同版本的addLinks自动处理的addLinks

然而,您正在使用的匹配“Android”的正则expression式只能通过调整正则expression式来匹配启动string的正则expression式:

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

注意添加“^”。 这就告诉正则expression式匹配器在启动string时只匹配模式“Android”。 如果这将与你的string,那么伟大。 如果你还有其他的情况,你想链接的单词不在行首,你需要更多的探索正则expression式。 我推荐这个网站来学习更多regular-expressions.info

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

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

它可能适用于所有的URL。

从Shawns的回答和SpunkerBaba的评论中,我已经拿出了这个帮手类。 这样可以避免你正在改变的URL被添加到你的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 ""; } }); } } 

用途:

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

问题解决了。 第一个问题的解决scheme是Ian Leslie提供的答案。 解决第二个问题的方法如下.API“L​​inkify.addLinks”的行为是这样的,它将要链接的string追加到url的末尾。 对于EX ..如果你想链接文本“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返回一个空string。 所以我最后的url是“www.android.com”

 TextView noteView = (TextView) findViewById(R.id.noteview); noteView.setText(someContent); Linkify.addLinks(noteView, Linkify.ALL); 

我认为你真正需要的是如此简单的事情:

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

您正在跟踪特定的url。 有些人build议使用Linkigy.ALL,但是你不需要这样做:

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

另外,其他人build议增加:

 textview.setMovementMethod(LinkMovementMethod.getInstance()); 

添加链接规则后,但addLinks已经在其内部做到这一点;-)

干杯!

对于带有lambdaexpression式的Koltin,就是这样的

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