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“Linkify.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 })