相信很多app在登录或者注册页面会出现下面这个样式:一行文字 两个下划线 两个点击事件。偷懒的实现 可能会放三四个textview 然后给其中两个添加下划线和点击事件,但感觉不是很优雅,于是就想到了用SpannableString来实现
鳖嗦话,直接上代码
String text = "登录/注册即表示同意链会议 服务条款 和 隐私条款";
SpannableString spanString = new SpannableString(text);
ForegroundColorSpan foregroundColorSpan = new ForegroundColorSpan(getResources().getColor(R.color.color_a0a0a0));
ClickableSpan serviceSpan = new ClickableSpan() {
@Override
public void onClick(View widget) {
}
};
UnderlineSpan underlineSpan = new UnderlineSpan(){
@Override
public void updateDrawState(TextPaint ds) {
ds.setColor(Color.parseColor("#a0a0a0"));
ds.setUnderlineText(true);
}
};
UnderlineSpan newUnderlineSpan = new UnderlineSpan(){
@Override
public void updateDrawState(TextPaint ds) {
ds.setColor(Color.parseColor("#a0a0a0"));
ds.setUnderlineText(true);
}
};
ClickableSpan privacySpan = new ClickableSpan() {
@Override
public void onClick(View widget) {
}
};
spanString.setSpan(foregroundColorSpan, 0, text.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spanString.setSpan(serviceSpan,14, 18, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spanString.setSpan(underlineSpan,14, 18, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spanString.setSpan(privacySpan,21, 25, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spanString.setSpan(newUnderlineSpan,21, 25, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
tvProtocol.setText(spanString);
tvProtocol.setMovementMethod(LinkMovementMethod.getInstance());
因为有好多博主已经详细解说过Spanned的flag 我在这就不废话了(其实也是自己没有去研究)
传送门:其实你不懂:Android之Spanned flag
这里主要记录一下我在使用中遇到的问题:
眼尖的小伙伴可能发现 我为啥写了两个一样的添加下划线的UnderlineSpan,用一个不是还节省对象的创建吗?!
最开始 我也是这么想的,但结果发现如果两个共用一个UnderlineSpan对象的话,UnderlineSpan设置的颜色就会失效。
有人问“为啥你的下划线还要设置颜色?”
其实,单独设置下划线的话,是不需要重写UnderlineSpan的updateDrawState()方法。
但由于我的需求里面 有下划线的那几个字是有额外的点击事件的,要想同时拥有点击和下划线,只能这么写(也可能是我还没有找到更好的)。