Daily Archives: 2009年9月2日

TextViewのAutoLinkのクリック時の挙動をカスタマイズするのがめんどい

LinkMovementMethodを継承してごにょごにょしようとしても基本的に中身が

ClickableSpan[] link = buffer.getSpans(off, off, ClickableSpan.class);
link[0].onClick(widget);

こんな感じなのでやりにくい。
LinkMovementMethod.onTouchEventとonKeyDownを差し替えてもいいがほとんどまるっとコピペして書き換えになるためそれは避けたい。

protected void onLinkClicked(ClickableSpan link, TextView widget);

とか用意しておいてくれれば良かったのにと思うが恨み言を言っても仕方ない。
ではspanを作っている段階で引っ掛けることを考えてみる。
spanを作っているのはTextViewからsetText時にAutoLinkMaskがオンだと呼び出されるLinkify.addLinksだ。
addLinkは正規表現でマスクに合わせたリンクっぽいものをかき集め、最後にspanを適用する。

private static final void applyLink(String url, int start, int end, Spannable text) {
URLSpan span = new URLSpan(url);
text.setSpan(span, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}

このURLSpanはonClickが実装されており

@Override
public void onClick(View widget) {
Uri uri = Uri.parse(getURL());
Context context = widget.getContext();
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
intent.putExtra(Browser.EXTRA_APPLICATION_ID, context.getPackageName());
context.startActivity(intent);
}

…で、setOnClickListenerはありません。えー…(‘A`)