Android中Textview超链接实现方式

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

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 p = Pattern.compile("@(w+?)(?=W|$)(.)");
    Linkify.addLinks(textView, p, "mxn://profile?uid=");
  }
}

接收的时候跟上面一样:

public class Test9Activity extends Activity {
  private String uid;
  private static final Uri PROFILE_URI = Uri.parse("mxn://profile");
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_test8);
    extractUidFromUri();
  }
  private void extractUidFromUri() {
    Uri uri = getIntent().getData();
    if (uri != null && PROFILE_URI.getScheme().equals(uri.getScheme())) {
      uid = uri.getQueryParameter("uid");
      Log.d("=====", "uid from url: " + uid);
    }
  }
}

效果如下:

其实在上面的图上可以看到,www.google.com并没有被识别为链接(因为我们没有设置web模式)。需要注意的是,当需要使自定义 模式和内置模式web,phone等一起被识别时,一定要先声明内置模式,然后再声明自定义模式,而且不能在xml中通过autoLink属性声明, 否则自定义模式不起作用。因为在设置内置模式时,会先删除已有模式。

将上面的Java代码改为:

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 p = Pattern.compile("@(w+?)(?=W|$)(.)");
    Linkify.addLinks(textView, Linkify.WEB_URLS);
    Linkify.addLinks(textView, p, "mxn://profile?uid=");
  }
}