今天公司接到了通知,需要在APP中加上关于用户协议和隐私政策的弹框,需要将“用户协议”和“隐私政策”变色和加点击状态。想到了用SpannableStringBuilder来做,将用到的方法和遇到的问题记录一下。
String msg2 = "《用户协议》";
SpannableStringBuilder spannable1 = new SpannableStringBuilder(msg2);
tvContent.setMovementMethod(LinkMovementMethod.getInstance());
spannable1.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.nvabar5)), 0, spannable1.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spannable1.setSpan(new TextClick1(), 0, spannable1.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
其中new TextClick1()是该变色的文字添加点击方法,TextClick1()代码如下
private class TextClick1 extends ClickableSpan {
@Override
public void onClick(View widget) {
Intent intent = new Intent(AgreementDialogAcitivity.this, WebViewActivity.class);
intent.putExtra(AppConst.IntentParameters.WEBVIEWURL, AppConst.SERVICEAGREEMENTURL);
intent.putExtra(AppConst.IntentParameters.ISPLAINTEXT, true);
intent.putExtra(AppConst.IntentParameters.TITLE, "用户协议");
startActivity(intent);
}
@Override
public void updateDrawState(TextPaint ds) {
ds.setUnderlineText(false);
}
}
等最后需要显示的时候需要注意一个问题,用户协议和隐私政策前后可能还有很多文字,千万不要简单的拼接起来直接放在textview显示,这样是行不通的,文字变色和点击也没有效果,要用append方法一个一个的追加上去。
比如这样是不行的:
StringBuilder stringBuffer = new StringBuilder();
String msg = stringBuffer.append(msg1).append(spannable1).append(msg3).append(spannable2).append(msg5).toString();
tvContent.setText(msg);
要这样才可以:
tvContent.setText(msg1);
tvContent.append(spannable1);
tvContent.append(msg3);
tvContent.append(spannable2);
tvContent.append(msg5);
欢迎交流。