TextView の一部のリンク化+クリックイベントの指定、をサクッと作る

  • 67
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

はじめに

ss.png

利用規約やプライバシーポリシーなど、テキストの一部にリンクを付けてブラウザに飛ばしたいときなどにコピペして使えるメモです。SpannableString を使いますが、これが結構面倒なのでまとめました。

リンク対象のテキストの指定には正規表現を使っていて、複数のリンクをまとめて同時につけられます。onClick の中身を変えれば、ブラウザに飛ばす以外のアクションにも使えます。

コード

SampleFragment.java

private void setSpannableString(View view) {

    String message = "利用規約、プライバシーポリシーに同意する。";

    // リンク化対象の文字列、リンク先 URL を指定する
    Map<String, String> map = new HashMap<String, String>();
    map.put("利用規約", "http://hogehoge.com/rules");
    map.put("プライバシーポリシー", "http://hogehoge.com/policies");

    // SpannableString の取得
    SpannableString ss = createSpannableString(message, map);

    // SpannableString をセットし、リンクを有効化する
    TextView textView = (TextView) view.findViewById(R.id.text);
    textView.setText(ss);
    textView.setMovementMethod(LinkMovementMethod.getInstance());
}

private SpannableString createSpannableString(String message, Map<String, String> map) {

    SpannableString ss = new SpannableString(message);

    for (final Map.Entry<String, String> entry : map.entrySet()) {
        int start = 0;
        int end = 0;

        // リンク化対象の文字列の start, end を算出する
        Pattern pattern = Pattern.compile(entry.getKey());
        Matcher matcher = pattern.matcher(message);
        while (matcher.find()) {
            start = matcher.start();
            end = matcher.end();
            break;
        }

        // SpannableString にクリックイベント、パラメータをセットする
        ss.setSpan(new ClickableSpan() {
            @Override
            public void onClick(View textView) {
                String url = entry.getValue();
                Uri uri = Uri.parse(url);
                Intent intent = new Intent(Intent.ACTION_VIEW, uri);
                startActivity(intent);
            }
        }, start, end, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
    }

    return ss;
}

参考

http://developer.android.com/reference/android/text/SpannableString.html
http://developer.android.com/reference/android/text/Spanned.html