可以使用SpannableString和ClickableSpan:
TextView userAgreement = findViewById(R.id.user_agreement);
SpannableString agreement = new SpannableString("Agree to the User Agreement and Privacy Policy");
agreement.setSpan(new MyClickableSpan("User Agreement"), 13, 27, SpannableString.SPAN_INCLUSIVE_INCLUSIVE);
agreement.setSpan(new MyClickableSpan("Privacy Policy"), 32, 46, SpannableString.SPAN_INCLUSIVE_INCLUSIVE);
userAgreement.setText(agreement);
userAgreement.setMovementMethod(LinkMovementMethod.getInstance());
上面代码中setMovementMethod这一句是固定的,必须添加,否则点击没效果。这里setSpan方法有四个参数:
//what:要加何种样式或功能
//start:开始加样式的位置
//end:结束加样式的位置
//flags:是否包含开始和结束位置的字符
public void setSpan (Object what, int start, int end, int flags)
其中start参数和end参数的确定有个小技巧,就是Android Studio当你在源代码窗格选择了一段文字,底部状态栏会自动出现字符个数,这样省着一个一个数字符的麻烦。
MyClickableSpan代码如下:
static class MyClickableSpan extends ClickableSpan {
private String text;
public MyClickableSpan(String text) {
this.text = text;
}
@Override
public void onClick(@NonNull View view) {
Toast.makeText(view.getContext(), text, Toast.LENGTH_SHORT).show();
}
@Override
public void updateDrawState(@NonNull TextPaint ds) {
super.updateDrawState(ds);
ds.setColor(Color.parseColor("#ff3783"));
ds.setUnderlineText(false);
}
}