サインインが必要なアプリで、「サービスに登録することで利用規約とプライバシーポリシーに同意したとみなします。」系のテキストの「利用規約」と「プライバリーポリシー」にClickListenerを付与したい場合のKotlinExtensionを書きました。
fun TextView.addLinkedSpannable(highlight: String, listener: (view: View) -> Unit) {
val original = when {
(text != null && text is SpannableString) -> text
else -> SpannableString(text)
}
val startPos = original.indexOf(highlight)
movementMethod = LinkMovementMethod.getInstance()
text = SpannableStringBuilder(original).also {
it.setSpan(object : ClickableSpan() {
override fun onClick(view: View) {
listener(view)
}
override fun updateDrawState(ds: TextPaint) {
super.updateDrawState(ds)
ds.color = ContextCompat.getColor(context, R.color.black)
}
}, startPos, startPos + highlight.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
}
}
TextViewExt.kt - Add linked spannable to TextView for Kotlin Android.
表示したいテキストをTextViewのtextに入れて、そのTextViewのaddLikedSpannable()
を実行すれば下線がついて、タップするとlistenerが実行されます。ひとつのtextに複数付与できます。
以下使用例です。
※ 文字列はstrings.xmlを使いましょう。
binding.textView.also {
it.text = "サービスに登録することで利用規約とプライバシーポリシーに同意したとみなします。"
it.addLinkedSpannable("利用規約") {
//Do something
}
it.addLinkedSpannable("プライバシーポリシー") {
//Do something
}
}