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

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

//ClikcableSpanTestActivity.java
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に移動(ブラウザアプリが起動)します。

using clickablespan 01

参考

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