使用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);
}
}










