TextViewにエラーアイコンを描画する

それはいいんだが、問題はこのポップアップ表示だ。どうしてこんなことになってしまうのだろう。〜
ErrorPopupクラスのインスタンス自体か、せめて描画を制御するメソッドが公開されていればいけそうなんだが、このままじゃ使えないよな。
TextView#setError

ビューのレイアウトによって非常に見苦しいことになるのは避けたいが、せっかくのエラー処理の仕組み、特にアイコンをTextView中に描画する仕組みは一般的であり、是非とも利用したい。

ということで調べてみたが、簡単に書けるようだ。

現在のコンテキストがActivity上だと仮定して、TextViewクラスであるviewの右端にアイコンを描画する場合は以下のように書けば良い。

Resource resource = this.getResources();
Drawable icon = resource.getDrawable(R.drawable.indicator_input_error);

icon.setBounds(0, 0, icon.getIntrinsicWidth(), icon.getIntrinsicHeight());
view.setCompoundDrawables(null, null, icon, null);

ちなみに、プロジェクトのres/drawable下にindicator_input_errorというidでアイコンリソースが定義されていることとしている。

setCompoundDrawablesメソッドの引数は、表示座標ではなく描画対象をViewのどこに描画するかのアンカーを示しており、それぞれにDrawableクラスのインスタンスをセット出来る。

分かり易い例で示そう。例えば、以下のようなEditTextに対してsetCompoundDrawablesメソッドの全ての引数にアイコンをセットしたとする。

view.setCompoundDrawables(icon, icon, icon, icon);
  • 実行結果


このように、それぞれの四辺(left, top, right, bottom)に対して別個にアイコンが描画される。なのでそれぞれの辺に違う描画対象(Drawable)を指定することも可能だ。

Drawableの生成は結構重い処理なので、上記のエラーアイコンのように使い回すことを前提にしている場合はキャッシュしておくほうが良いかもしれない。