36
30

More than 5 years have passed since last update.

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

Last updated at Posted at 2013-10-17

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

参考

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

36
30
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
36
30