2015-05-29 2 views
4

Телефоны с SDK 20+ считают, что любые два слова с точкой между ними являются ссылкой. Как я могу сделать свой собственный детектор Link?android autolink слишком агрессивен

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. Даже когда я использую Linkify вместо LinkManager

Я пробовал много других решений, все из которых не связаны ни с чем, ни с чем. Любое решение там?

+0

вещь, 'abra.kadabra' вполне может быть адресом (это не сегодня). Сейчас есть группа TLD. – njzk2

ответ

3

Вы можете сделать свой собственный детектор связи с помощью Matcher и Pattern классов и сделать их доступными с помощью 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 с вашим собственным. Вы можете найти некоторые шаблоны url в StackOverflow.

0

Я исправил это сам, вызвав этот метод перед супер-методом setText, так как все тексты, которые я хочу связать, устанавливаются динамически.

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

с пользовательским шаблоном для URL-адресов Я хочу принять. Спасибо за помощь, я ценю это.