EditText で Link

2012年5月14日月曜日

Android

t f B! P L

久々にはまったことメモ。
テキストにリンクを貼る方法は知っている限りだと以下の4つなんですが

  • Html.fromHtml で <A> タグを使う
  • ClickableSpan を setSpan する
  • URLSpan を setSpan する
  • setAutoLinkMask を使う

いずれも、EditText で使うと、文字の編集はできなくなってしまいます。 1.6 のエミュで試してみた限りでは、上3つはかろうじて入力できるものの文の先頭に文字が挿入されるだけでカーソル移動がカーソルキーでもタップでも一切できない(リンクのほうにイベントを奪われる)ので現実的には編集不可能。 AutoLink の場合は入力した時点で例外でコケました。
ググってみたんですが、そもそもリンクを貼る機能は TextView での使用を前提とした機能で EditText 使うなってことみたいでした。
でもまぁ、編集さえしなければ EditText でもリンク自体は機能するので、わざわざ TextView に移し変えるのもエコじゃないし(入ってるテキストが長い上に色んな span たくさんついてるので、移し変えるとまた getSpan でえらいリソース食うに違いない!)、リンク機能が有効な場合は閲覧モードで開き、コンテキストメニューで編集モードに切り替えられる(編集モードの間はリンクはタップしても何もおきない)、という仕様にしてみました。バリバリ編集しつつリンクはリンクでタップしたら飛べるぜ!って実装方法知っている方いましたら教えてください・・・。

ちなみに、オプションメニューに関しては、onCreateOptionsMenu が呼ばれるのは最初の1回だけで、動的に変更したい場合には onPrepareOptionsMenu を使う必要がありましたが、コンテキストメニューに関しては毎回 onCreateContextMenu が呼ばれるみたいです。動的に変えたい場合もこのメソッドに入れといてOKです。onPrepareContextMenu というメソッドは存在しないぽい。

QooQ