本文已参与好文召集令活动,点击查看:后端、大前端双赛道投稿,2万元奖池等你挑战!前端
最近公司在用户登陆界面要加《用户协议》以及《隐私政策》,话还没等产品说完,我就想到了用 SpannableString 作,提及来简单,固然,作起来也简单,以前作app都会有这种需求,此次字比较多,一行展现不完,如图1,2,不过这不要紧,而后我就提给测试测了,过了会,刚要伸懒腰,测试过来讲有问题,为啥点空白区域也会进隐私政策的界面,很纳闷,我测的时候没问题啊(原来是只点了字的,尴尬),那就改呗,因而踏上英雄的征途。java
图1
图2android
第一阶段:遇到问题;第二阶段:寻找问题; 第三阶段:解决问题;第四阶段:把这个解决问题方法分享给你们。后端
点击空白区域也能触发点击事件markdown
经过SpannableString 虽然设置好了,可是还差点击事件的响应,若是不加下面这行代码,那么点击事件是没有用的,因此问题出如今了这,以下图: 那就看源码吧,LinkMovementMethod类,点击事件确定经过onTouchEvent方法实现,下图圈起来的,在特定的条件下会计算出错致使的,这里的特定条件有两种状况:app
第一种:当你的TextView宽度设置为android:layout_width="wrap_content"而且存在换行时;ide
第二种:当你的TextView宽度设置为android:layout_width="match_parent"而且没有填满TextView时工具
<string name="privacy_policy">《隐私政策》 </string>
布局
注意:由于加了空格,因此别忘了减1,以下图:post
如下是所有代码:方便你们搬砖愉快。
<string name="login_consent">登陆注册即代表您已阅读并赞成</string>
<string name="user_service">《用户服务协议》 </string>
<string name="privacy_policy">《隐私政策》 </string>
复制代码
<TextView
android:id="@+id/tv_agreement"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:layout_marginBottom="20dp"
/>
复制代码
/** * @author Created by JasonYin * Description:协议工具类 */
class LoginAgrementView(private val activity: Activity, private val tvArrgement: TextView) {
/** * 用户协 */
fun useAgrement() {
tvArrgement.text = activity.getString(R.string.login_consent)
val clickString = SpannableString(activity.getString(R.string.user_service))
clickString.setSpan(ForegroundColorSpan(Color.parseColor("#FFFFFF")), 0, clickString.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
clickString.setSpan(object : ClickableSpan() {
override fun onClick(widget: View) {
Log.e("---> $", "用户协议")
}
override fun updateDrawState(ds: TextPaint) {
super.updateDrawState(ds)
ds.color=ContextCompat.getColor(activity, R.color.blue)
ds.isUnderlineText = false
}
}, 0, clickString.length - 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
tvArrgement.append(clickString)
tvArrgement.append(SpannableString("和"))
val clickStringPrivacy = SpannableString(activity.getString(R.string.privacy_policy))
clickStringPrivacy.setSpan(object : ClickableSpan() {
override fun onClick(widget: View) {
Log.e("---> $", "隐私政策")
}
override fun updateDrawState(ds: TextPaint) {
super.updateDrawState(ds)
ds.color=ContextCompat.getColor(activity, R.color.blue)
ds.isUnderlineText = false
}
}, 0, clickStringPrivacy.length - 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
tvArrgement.append(clickStringPrivacy)
//开始响应点击事件
tvArrgement.movementMethod = LinkMovementMethod.getInstance()
}
}
复制代码
LoginAgrementView(this, mBinding.tvProtocol).useAgrement()
复制代码