リンク化できるものを全てリンクにする
XMLなら、
android:autoLink="all"
コード内で書くなら、
textView.setAutoLinkMask(Linkify.ALL);
を指定することで、メールアドレス、URL、電話番号、住所(日本語非対応)をリンクにできる。Linkify.EMAIL_ADDRESSES
やLinkify.WEB_URLS
のようにして、メールアドレスやURLだけを個別に指定することも可能。
https://developer.android.com/reference/android/widget/TextView.html#attr_android:autoLink
特定のサイトのみリンク化する
Linkify.MatchFilterを使ってパターンにマッチしたURLのみをリンク化する。以下はYoutubeのみを許可した例。
Linkify.addLinks(textView, Patterns.WEB_URL, null, new Linkify.MatchFilter() {
@Override
public boolean acceptMatch(CharSequence charSequence, int start, int end) {
String url = charSequence.subSequence(start, end).toString();
Pattern pattern = Pattern.compile("^https?://((www\\.)?youtube\\.com|youtu\\.be)/");
Matcher matcher = pattern.matcher(url);
return matcher.find();
}
}, null);
特定のワードがあったらリンク化する
Linkify.TransformFilterを使ってパターンにマッチしたワードをリンク化する。addLinksでスキームを指定すると先頭に追加してリンク化できる。以下は@付きのテキストがあったらTwitterリンクにする例。
Pattern pattern = Pattern.compile("@([A-Za-z0-9_-]+)");
String scheme = "http://twitter.com/";
Linkify.addLinks(textView, pattern, scheme, null, new Linkify.TransformFilter() {
@Override
public String transformUrl(Matcher matcher, String s) {
return matcher.group(1);
}
});
aタグをリンク化する
HTMLクラスのfromHtmlを使うことで、aタグをリンク化できる。クリックできるようにするには、LinkMovementMethodをセットする必要がある。
https://developer.android.com/reference/android/text/Html.html
textView.setText(Html.fromHtml("<a href=\"https://qiita.com/\">qiita</a>"));
textView.setMovementMethod(LinkMovementMethod.getInstance());
※from.HtmlはAPIレベル24以上ではdeprecetedになっているので、ヘルパークラスなどを作ると良いよという記事があった。
https://stackoverflow.com/questions/37904739/html-fromhtml-deprecated-in-android-n
@SuppressWarnings("deprecation")
public static Spanned fromHtml(String html){
Spanned spanned;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
spanned = Html.fromHtml(html,Html.FROM_HTML_MODE_LEGACY);
} else {
spanned = Html.fromHtml(html);
}
return spanned;
}
追記(2021/04/26)
上記に記載した、aタグのリンク化におけるSDKバージョンによる分岐ですが、HtmlCompatの登場により不要となりました。
HtmlCompat.fromHtml(html, HtmlCompat.FROM_HTML_MODE_LEGACY);
のように呼び出すことで、バージョンの差異を気にすることなく利用できます。
https://developer.android.com/reference/androidx/core/text/HtmlCompat
はまったこと
Linkify.addLinksを設定した後にsetMaxLinesを指定するとリンク化が無効になってしまう。動的に行数を変化させているViewの場合には、setMaxLineの後にかけるなどの注意が必要。