Android

TextViewのリンク化いろいろ

More than 1 year has passed since last update.

リンク化できるものを全てリンクにする

XMLなら、

android:autoLink="all"

コード内で書くなら、

textView.setAutoLinkMask(Linkify.ALL);

を指定することで、メールアドレス、URL、電話番号、住所(日本語非対応)をリンクにできる。Linkify.EMAIL_ADDRESSESLinkify.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;
}

はまったこと

Linkify.addLinksを設定した後にsetMaxLinesを指定するとリンク化が無効になってしまう。動的に行数を変化させているViewの場合には、setMaxLineの後にかけるなどの注意が必要。