首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >android autolink太咄咄逼人

android autolink太咄咄逼人
EN

Stack Overflow用户
提问于 2015-05-29 11:47:56
回答 2查看 1.9K关注 0票数 5

带有SDK 20+的手机认为,在它们之间有一个点的任何两个单词都是一个链接。我怎么做我自己的链接探测器?

android:autoLink="web"认为abra.kadabra是一个url。

setAutoLinkMask(Linkify.WEB_URLS);认为abra.kadabra是一个url。

带有SDK < 20的手机可以正确链接所有的东西,只有当SDK是20+时才会发生错误。

我尝试过的例子:

代码发生在我的自定义TextView

代码语言:javascript
复制
SpannableString ss = new SpannableString(this.getText().toString());    
//LinkManager is a copy of Linkify but with another pattern.       
LinkManager.addLinks(ss, LinkManager.WEB_URLS);   
setText(ss);            
setMovementMethod(LinkMovementMethod.getInstance());   
setWebLinksTouchFeedback();

这没有联系到任何东西。即使我使用Linkify而不是LinkManager

我尝试过许多其他的解决方案,所有这些最终都是把任何东西或一切联系起来。有什么解决办法吗?

EN

回答 2

Stack Overflow用户

发布于 2015-05-29 21:16:02

您可以使用MatcherPattern类制作您自己的链接检测器,并使用ClickableSpan使它们可点击。

代码语言:javascript
复制
String text = textView.getText().toString();

int i=0;
SpannableString spannableString = new SpannableString(text);
Matcher urlMatcher = Patterns.WEB_URL.matcher(text);
while(urlMatcher.find()) {
    String url = urlMatcher.group(i);
    int start = urlMatcher.start(i);
    int end = urlMatcher.end(i++);
    spannableString.setSpan(new GoToURLSpan(url), start, end, 0);
}

textView.setText(spannableString);
textView.setMovementMethod(new LinkMovementMethod());    
代码语言:javascript
复制
private static class GoToURLSpan extends ClickableSpan {
    String url;

    public GoToURLSpan(String url){
        this.url = url;
    }

    public void onClick(View view) {
        Uri webPage = Uri.parse(url); //http:<URL> or https:<URL>
        Intent intent = new Intent(Intent.ACTION_VIEW, webPage);
        view.getContext().startActivity(intent);
    }
}
代码语言:javascript
复制
<TextView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/text"
    android:text="Link http://google.com but dont link abra.kadabra"
    android:textColorLink="@color/accent"
    android:textColorHighlight="@color/accent" />

Pattern.WEB_URL替换为您自己的。您可以在StackOverflow中找到一些url模式。

票数 3
EN

Stack Overflow用户

发布于 2015-06-02 13:35:10

我自己修正了这个方法,在setText的超级方法之前调用这个方法,因为我想链接的所有文本都是动态设置的。

代码语言:javascript
复制
private void linkifyTexts(CharSequence charsequence)
{
    String text = charsequence.toString();
    String[] parts = text.split("\\s+");
    for (int i = 0; i < parts.length; i++)
    {
        boolean isUrl = isURLValid(parts[i]);
        if (isUrl)
        {
            setAutoLinkMask(Linkify.WEB_URLS | Linkify.EMAIL_ADDRESSES);
            setWebLinksTouchFeedback();
            break;
        }
    }
}

public boolean isURLValid(String url)
{
    Pattern p = Pattern.compile(getContext().getString(R.string.url_pattern));
    return p.matcher(url).matches();
}

具有我想接受的urls的自定义模式。谢谢你的帮助,我很感激。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30528825

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档