2016-06-13 9 views
1

У меня есть TextView, что я в настоящее время сопрягать для связи с:Игнорировать один URL в linkify

Linkify.addLinks(holder.tvMessage, Linkify.ALL); 

Однако, теперь я хочу, чтобы соответствовать все (номера телефонов, сообщения электронной почты, URL), за исключением одного particulat URL, http://dontmatch.com.

Я попробовал последующие вызовы, такие как:

Linkify.addLinks(holder.tvMessage, Linkify.EMAIL_ADDRESSES); 
    Linkify.addLinks(holder.tvMessage, Linkify.PHONE_NUMBERS); 
    Linkify.addLinks(holder.tvMessage, Linkify.MAP_ADDRESSES); 
    Linkify.addLinks(holder.tvMessage, pattern, "http://"); 

Но, кажется, что каждый вызов перекрывает звенья предыдущего оставив только ссылки последнего вызова. Я также не уверен, как писать регулярное выражение, чтобы соответствовать всем, кроме сайта, который я хочу игнорировать. Нужен ли мне MatchFilter?

Update:

Я могу отфильтровать URL Я не хочу с:

Linkify.addLinks(holder.tvMessage, Patterns.WEB_URL, null, new MatchFilter() { 
      @Override 
      public boolean acceptMatch(CharSequence seq, int start, int end) { 
       String url = seq.subSequence(start, end).toString(); 
       //Apply the default matcher too. This will remove any emails that matched. 
       return !url.contains("dontmatch") && Linkify.sUrlMatchFilter.acceptMatch(seq, start, end); 
      } 
     }, null); 

Но как указать, что я хочу, сообщения электронной почты, номера телефонов и т.д.?

ответ

2

В конце концов я решил это так, но я действительно надеюсь, что есть лучший способ:

private void linkifyView(TextView textview) { 

    Linkify.addLinks(textview, Patterns.WEB_URL, null, new MatchFilter() { 
     @Override 
     public boolean acceptMatch(CharSequence seq, int start, int end) { 
      String url = seq.subSequence(start, end).toString(); 
      //Apply the default matcher too. This will remove any emails that matched. 
      return !url.contains(IGNORE_URL) && Linkify.sUrlMatchFilter.acceptMatch(seq, start, end); 
     } 
    }, null); 

    //Linkify removes any existing spans when you call addLinks, and doesn't provide a way to specify multiple 
    //patterns in the call with the MatchFilter. Therefore the only way I can see to add the links for 
    //email phone etc is to add them in a separate span, and then merge them into one. 
    SpannableString webLinks = new SpannableString(textview.getText()); 
    SpannableString extraLinks = new SpannableString(textview.getText()); 

    Linkify.addLinks(extraLinks, Linkify.MAP_ADDRESSES | Linkify.EMAIL_ADDRESSES | Linkify.PHONE_NUMBERS); 

    textview.setText(mergeUrlSpans(webLinks, extraLinks)); 
} 

private SpannableString mergeUrlSpans(SpannableString span1, SpannableString span2) { 

    URLSpan[] spans = span2.getSpans(0, span2.length() , URLSpan.class); 
    for(URLSpan span : spans) { 
     span1.setSpan(span, span2.getSpanStart(span), span2.getSpanEnd(span), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
    } 

    return span1; 
}