【Android】TextView内のURLリンク

# 文字内にURL埋め込み (下線あり)
xmlの```</a>```タグを使用。

```strings.xml
<string name="text">確認は<a href="https://www.example.com">こちら</a>から</string>
```

```activity_main.xml
<TextView
	android:id="@+id/text"
	android:layout_width="0dp"
	android:layout_height="0dp"
	android:text="@string/text"
	android:textColorLink="@color/design_default_color_primary"
	android:textSize="20sp"
	app:layout_constraintBottom_toBottomOf="parent"
	app:layout_constraintEnd_toEndOf="parent"
	app:layout_constraintStart_toStartOf="parent"
	app:layout_constraintTop_toTopOf="parent"/>
```

```MainActivity.kt
binding.text.movementMethod = LinkMovementMethod.getInstance()
```

|![スクリーンショット 2022-03-09 160748.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694762/3badc5ab-6364-5300-0f8e-6ec614dfff83.png)|
|:-:|

# 文字内にURL埋め込み (下線なし)
URLSpanクラスを拡張して使用。

```activity_main.xml
<TextView
	android:id="@+id/text"
	android:layout_width="0dp"
	android:layout_height="0dp"
	android:textColorLink="@color/design_default_color_primary"
	android:textSize="20sp"
	app:layout_constraintBottom_toBottomOf="parent"
	app:layout_constraintEnd_toEndOf="parent"
	app:layout_constraintStart_toStartOf="parent"
	app:layout_constraintTop_toTopOf="parent"/>
```

```MainActivity.kt
val clickableSpan = object : URLSpan("https://www.example.com") {
	override fun updateDrawState(ds: TextPaint) {
		super.updateDrawState(ds)
		ds.isUnderlineText = false
	}
}

binding.text.text = SpannableString("確認はこちらから").apply {
	setSpan(clickableSpan, 3, 6, Spanned.SPAN_INCLUSIVE_INCLUSIVE)
}
binding.text.movementMethod = LinkMovementMethod.getInstance()
```

|![スクリーンショット 2022-03-09 154025.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694762/1d532d71-3541-0de1-8bb0-bd1f948f2b75.png)|
|:-:|

[参照記事](https://qiita.com/nakashimaakio/items/6984378f7aa4fdbea7bc)

# テキスト内のURL自動検出(下線あり)
```android:autoLink```を使用。

```activity_main.xml
<TextView
	android:id="@+id/text"
	android:layout_width="0dp"
	android:layout_height="0dp"
	android:autoLink="web"
	android:text="確認URL: https://www.example.com"
	android:textColorLink="@color/design_default_color_primary"
	android:textSize="20sp"
	app:layout_constraintBottom_toBottomOf="parent"
	app:layout_constraintEnd_toEndOf="parent"
	app:layout_constraintStart_toStartOf="parent"
	app:layout_constraintTop_toTopOf="parent"/>
```

|![スクリーンショット 2022-03-09 161315.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694762/3cc4f659-228d-68dc-51d8-5612b4fa2882.png)|
|:-:|

# テキスト内のURL自動検出(下線なし)
URLSpanクラスを拡張して使用。
```activity_main.xml
<TextView
	android:id="@+id/text"
	android:layout_width="0dp"
	android:layout_height="0dp"
	android:text="確認URL: https://www.example.com"
	android:textColorLink="@color/design_default_color_primary"
	android:textSize="20sp"
	app:layout_constraintBottom_toBottomOf="parent"
	app:layout_constraintEnd_toEndOf="parent"
	app:layout_constraintStart_toStartOf="parent"
	app:layout_constraintTop_toTopOf="parent"/>
```

```MainActivity.kt
val spannable = binding.text.text.toSpannable()
val matcher = Pattern.compile("(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]")
	.matcher(binding.text.text)
while (matcher.find()) {
	val urlSpan = object : URLSpan(matcher.group()) {
		override fun updateDrawState(ds: TextPaint) {
			super.updateDrawState(ds)
			ds.isUnderlineText = false
		}
	}
	spannable.setSpan(urlSpan, matcher.start(), matcher.end(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
}
binding.text.text = spannable
binding.text.movementMethod = LinkMovementMethod.getInstance()
```

|![スクリーンショット 2022-03-09 163045.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694762/82b55088-d77b-7aeb-7c53-8bf0c156df30.png)|
|:-:|

[参照記事](https://android.gcreate.jp/482/)