Android中Textview超链接实现方式

2019-12-10 19:09:36王旭

使用Transform Filter

Transform Filter为格式化文本字符串提供了更大的自由度,允许你修改由链接文本自动生成的隐式URI。 减少链接文本和目标URI的耦合能更加自由地决定如何显示数据字符串给用户。

使用Transform Filter,在你定义的TransformFilter中实现transformUrl方法。当Linkify找到正确的匹配后,它会调用transformUrl, 传入使用的RegEx样式和它创建的默认URI字符串。你可以修改匹配的字符串,然后返回一个适合给其它Android应用程序的URI。 利用Transform Filter的修改功能可以实现点击用户名,传递的是用户id的功能,在transformUrl中返回你需要传递的内容

下面的TransformFilter实现将匹配的文本转换成小写的URI:

class MyTransformFilter implements TransformFilter {
    public String transformUrl(Matcher match, String url) {
      return url.toLowerCase();
  }
}

现在我们加上Match Filter和Transform Filter,上面的代码可以修改成如下的样子:

 

public class Test10Activity extends Activity {
  TextView textView ;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_test10);
    textView = (TextView) findViewById(R.id.text);
    Pattern mentionsPattern = Pattern.compile("@(w+?)(?=W|$)(.)");
    String mentionsScheme = String.format("%s/?%s=", "mxn://profile", "uid");
    Linkify.addLinks(textView, Linkify.WEB_URLS);
//    Linkify.addLinks(textView, mentionsPattern, mentionsScheme) ;
    Linkify.addLinks(textView, mentionsPattern, mentionsScheme, new Linkify.MatchFilter() {
      @Override
      public boolean acceptMatch(CharSequence s, int start, int end) {
        return s.charAt(end-1) != '.';
      }
    }, new Linkify.TransformFilter() {
      @Override
      public String transformUrl(Matcher match, String url) {
        return url.toLowerCase();
      }
    });
    stripUnderlines(textView) ;
  }
  private class URLSpanNoUnderline extends URLSpan {
    public URLSpanNoUnderline(String url) {
      super(url);
    }
    @Override public void updateDrawState(TextPaint ds) {
      super.updateDrawState(ds);
      ds.setUnderlineText(false);
    }
  }
  private void stripUnderlines(TextView textView) {
    Spannable s = (Spannable)textView.getText();
    URLSpan[] spans = s.getSpans(0, s.length(), URLSpan.class);
    for (URLSpan span: spans) {
      int start = s.getSpanStart(span);
      int end = s.getSpanEnd(span);
      s.removeSpan(span);
      span = new URLSpanNoUnderline(span.getURL());
      s.setSpan(span, start, end, 0);
    }
    textView.setText(s);
  }
}