はじめに
利用規約やプライバシーポリシーなど、テキストの一部にリンクを付けてブラウザに飛ばしたいときなどにコピペして使えるメモです。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