android autolink太激进了

时间:2015-05-29 11:47:56

标签: android linkify

SDK 20+的手机认为任何两个带有点之间的单词都是链接。如何制作自己的Link探测器?

android:autoLink="web"认为abra.kadabra是个网址。

setAutoLinkMask(Linkify.WEB_URLS);认为abra.kadabra是个网址。

SDK<的电话20正确链接所有内容,错误仅在SDK为20 +时发生。

我尝试过的例子:

我的自定义TextView中发生了代码

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

我尝试了许多其他解决方案,所有这些解决方案最终都无法连接任何内容。那里有解决方案吗?

2 个答案:

答案 0 :(得分:3)

您可以使用MatcherPattern类创建自己的链接检测器,并使用ClickableSpan进行点击。

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());    
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);
    }
}
<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替换为您自己的<div>。您可以在StackOverflow中找到一些网址模式。

答案 1 :(得分:0)

我通过在setText的super方法之前调用此方法来自行修复它,因为我想要链接的所有文本都是动态设置的。

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

我想接受的网址自定义模式。感谢您的帮助,我很感激。