LoginSignup
3
4

More than 3 years have passed since last update.

AndroidでTextViewのテキストの一部にリンクをつけたいときのKotlinExtension

Last updated at Posted at 2020-02-03

サインインが必要なアプリで、「サービスに登録することで利用規約とプライバシーポリシーに同意したとみなします。」系のテキストの「利用規約」と「プライバリーポリシー」に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
  }
}

参考

TextViewの一部にリンクをつける - Qiita

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4