通过SpannableString实现隐私政策弹窗
SpannableString能设置不一样的文字样式
通过setSpan的方法进行设置
从源码可以看到可以填写四个参数,第一个参数what可以设置多种效果:
ForegroundColorSpan :字体颜色
BackgroundColorSpan:背景颜色
AbsoluteSizeSpan:字体大小
StyleSpan:粗斜体
StrikethroughSpan:删除线
UnderlineSpan:下划线
ImageSpan:图片
start - end 参数是设置显示的位置
可以用字体,也可以用下标
flags
在操作TextView的时候是没什么作用,但是在EditText这种可以输入的文本的时候,flags就起作用了。
你已经将某段字符做出改变,而你在所改变内容前后输入新的内容时,就会根据flags有所变化。
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE 前后都不包含
Spanned.SPAN_EXCLUSIVE_INCLUSIVE 不包含前面 包含后面
Spanned.SPAN_INCLUSIVE_EXCLUSIVE 包含前面,不包含后面
Spanned.SPAN_INCLUSIVE_INCLUSIVE 前后都包含
下面就通过SpannableString来实现隐私政策的弹窗跳转
代码
fun onClick(view: View) {
// 弹窗
val dialog = AlertDialog.Builder(this)
dialog.setTitle("隐私政策")
//组装弹窗信息
dialog.setMessage(spannableString())
dialog.setPositiveButton("同意"){ dialog, which ->
}
dialog.setNegativeButton("不同意"){ dialog, which ->
}
dialog.show()
}
//设置信息显示格式
private fun spannableString () : SpannableString {
val contentStr = "请你务必审慎阅读、充分理解“用户协议”和“隐私政策”各条款,包括但不限于:为了向你提供即时评论、内容分享等服务,我们需要收集你的设备信息、操作日志等个人信息。你可阅读《用户协议》和《隐私政策》了解详细信息。如你同意,请点击”同意”开始接受我们的服务。"
val userStr = "《用户协议》"
val privacyStr = "《隐私政策》"
//字符串拼接
val userStrStartIndex = contentStr.indexOf(userStr,0)
val privacyStrStartIndex = contentStr.indexOf(privacyStr,0)
val userStrEndIndex = userStrStartIndex + userStr.length
val privacyStrEndIndex = privacyStrStartIndex + privacyStr.length
var spannableString = SpannableString(contentStr)
var color = ContextCompat.getColor(this, R.color.blue)
//设置样式
spannableString.setSpan(ForegroundColorSpan(color), userStrStartIndex, userStrEndIndex, Spanned.SPAN_INCLUSIVE_EXCLUSIVE)
spannableString.setSpan(ForegroundColorSpan(color), privacyStrStartIndex, privacyStrEndIndex, Spanned.SPAN_INCLUSIVE_EXCLUSIVE)
spannableString.setSpan(
UserClickableSpan(), userStrStartIndex, userStrEndIndex,
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
spannableString.setSpan(
PrivacyClickableSpan(), privacyStrStartIndex, privacyStrEndIndex,
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
return spannableString
}
/**
* 用户协议
* 点击事件
*/
private inner class UserClickableSpan() : ClickableSpan(), View.OnClickListener {
override fun updateDrawState(ds: TextPaint) {
ds.isUnderlineText = false //去除超链接的下划线
ds.clearShadowLayer()
}
override fun onClick(v: View) {
val intent = Intent()
intent.action = "android.intent.action.VIEW";
intent.data = Uri.parse("https://www.baidu.com/");
startActivity(intent);
}
}
/**
* 隐私政策
* 点击事件
*/
private inner class PrivacyClickableSpan() : ClickableSpan(), View.OnClickListener {
override fun updateDrawState(ds: TextPaint) {
ds.isUnderlineText = false //去除超链接的下划线
ds.clearShadowLayer()
}
override fun onClick(v: View) {
val intent = Intent()
intent.action = "android.intent.action.VIEW";
intent.data = Uri.parse("https://www.baidu.com/");
startActivity(intent);
}
}