开发中,经常要用到一些阅读隐私协议的场景,原生的textview控件很难做到在一个控件里有两个点击事件,那现在就来安利一个强大的组件——SpannableStringBuilder。
先看看效果:
直接上代码,布局文件:
<LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:paddingLeft="40dp"android:paddingRight="40dp"android:gravity="center_vertical"android:orientation="horizontal"><CheckBoxandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:gravity="center_vertical"android:text="我已阅读并同意" /><TextViewandroid:id="@+id/login_rule"android:layout_width="wrap_content"android:text="《用户协议》、"android:layout_height="wrap_content"/></LinearLayout>
布局文件很容易理解,一个checkbox实现选中效果,旁边加一个textview。
在activity中;
private TextView mLoginRule;
通过findviewbyid获取控件id后
private void setRule() {SpannableStringBuilder span = new SpannableStringBuilder();span.append("隐私协议").append("、").append("用户协议");ClickableSpan clickableSpan = new ClickableSpan() {@Overridepublic void onClick(@NonNull View view) {ToastUtils.show("隐私政策");}};ClickableSpan clickableSpan2 = new ClickableSpan() {@Overridepublic void onClick(@NonNull View view) {ToastUtils.show("用户协议");}};span.setSpan(clickableSpan,0,4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);span.setSpan(clickableSpan2,5,9, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);mLoginRule.setText(span);mLoginRule.setMovementMethod(LinkMovementMethod.getInstance());}
代码很容易理解,重点讲讲setSpan,这里第一个参数定义了响应点击事件的方法,第二个就是文字的开头角标,第三个是文字结尾角标,第四个表示不包含start和end所在的端点 (star,end)
setSpan(clickableSpan,0,4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
注意
mLoginRule.setMovementMethod(LinkMovementMethod.getInstance());
很关键,否则无法响应点击事件