Experiments Never Fail

TextView で、テキストの一部だけクリック可能にする

Android の TextView で、「テキストの一部を押すとなんかのアクションが起こる」というのが ClickableSpan というのを使えばできそうだったので、やってみました。

public class ClikcableSpanTestActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

final List<Pair<String, String>> data = new ArrayList<Pair<String,String>>();
data.add(new Pair<String, String>("りんご", "隠し味としてカレーに入れます"));
data.add(new Pair<String, String>("みかん", "あぶりだしに使います"));
data.add(new Pair<String, String>("すいか", "種を食べると盲腸になります(嘘)"));

final SpannableStringBuilder sb = new SpannableStringBuilder();
final String SEP = ", ";
int spanStart = 0;

for (final Pair<String, String> p : data) {
sb.append(p.first);
sb.append(SEP);

// 追加した文字列を Span にする
sb.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {
Toast.makeText(getApplicationContext(),
p.second, Toast.LENGTH_SHORT).show();
}
}, spanStart, spanStart + p.first.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

spanStart += (p.first.length() + SEP.length());
}

TextView tv = (TextView)findViewById(R.id.text);
tv.setText(sb);
tv.setMovementMethod(LinkMovementMethod.getInstance()); // これ忘れるとクリックできなくて小一時間悩む
}
}

項目をカンマつなぎで表示して、項目のところだけリンクっぽくします。
リンクをクリックすると Toast を表示します。(下図のように)
また URLSpan というクラスもあり、クリックすると指定したURLに移動(ブラウザアプリが起動)します。

参考 #

装飾したり位置やサイズ変えたり、TextView でもいろいろできるんですねー。
(VB6の)Label とは違うのだよ、Label とは!

published at tags: Android