LoginSignup
0
0

More than 5 years have passed since last update.

SpannableStringでListViewの一部をリンク化

Posted at

SapnnableStringを使って、ListViewの一部の文字列をリンク化する方法で、ListViewに表示する各セルの情報を結びつけるためのAdapterクラス内に記述します。

SpannableStringをセットして、クリックイベントでリンク先に遷移させる際、Adapterクラス内にmContextとしてデーターを保持する必要があります。

今回はListViewのテキスト部分の"Hand"という文字列をクリックするとgoogleのサイトに遷移するように設定しています。

public class MessageRecordsAdapter extends ArrayAdapter<MessageRecord> {

    private ImageLoader mImageLoader;
    private Context mContext;

    public MessageRecordsAdapter(Context context) {
        super(context, R.layout.message_item);

        mContext = context;

        mImageLoader = new ImageLoader(VolleyApplication.getInstance().getRequestQueue(), new BitmapLruCache());
    }

    ...

    private void setSpannableString(TextView textView) {

        String message = textView.getText().toString();

        // リンク化対象の文字列、リンク先 URL を指定する
        Map<String, String> map = new HashMap<String, String>();
        map.put("Hand", "http://google.com/");

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

        // SpannableString をセットし、リンクを有効化する
        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);
                    mContext.startActivity(intent);
                }
            }, start, end, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
        }
        return ss;
    }
0
0
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
0
0