2012年4月8日日曜日

EditText周りのメモ

Editableインターフェース

AndroidではTextViewでの文字列の扱いにStringクラスやStringBuilderクラスではなく、Editableインターフェースを用いる。


Editableという名前から、不変なStringクラスではオーバーヘッドがあるため特別なインターフェースがあるのではないか?と想像するが、それならばStringBuilderやStringBuffer、CharSequenceではなぜダメなのか?という疑問が浮かぶ。(この辺javaをよく理解していないからこその疑問かもしれないけれど)
結論から言えば、Editableは文字装飾と入力フィルタを備えた特殊な文字列クラスとして用意されている。


文字列装飾はより正確に言えばEditableインターフェースが実装しているSpannableインターフェースにおいて、装飾追加と除去を行うメソッドが定義されている。装飾の実体は抽象クラスCharacterStyleのサブクラスで実装されている。


InputFilterインターフェースのfilterメソッドに記述されたルールに従い、Editableに入力された文字列にフィルタリングを行う。XMLレイアウトエディタでTextViewを配置した際に、InputTypeやmaxlengthで入力できる文字列を制限した際には、内部では相当するInputFilterインターフェースがセットされている。
コードで記述するとより柔軟で強力なフィルタリングルールを作れる。


IMEとの連携


IME(Input Method Editor)とはキーボード入力を補助するソフトウェアのこと。ハードウェアキーボードを用いる一般的なPCでは日本語変換機能のことを差すが、スマートフォンでは仮想キーボードも立派に入力補助ソフト一部。
Androidにおけるソフトウェアキーボードは、サービスとして実装されている。タッチ入力を受け取り、それを解釈したらキーイベントに変換して投げている。


EditableインターフェースはIMEと連携して、IMEのアクションボタンを変化させられる。例えば入力欄が複数ある際に他の入力欄にフォーカスを移す「次へ」、入力欄が検索バーならば「検索する」ボタンを表示させる、逆にメールなど誤送信を防ぐために入力を押しても即座にアクションを起こさないようにするなど。
XMLのIMEOptionsでアクションを定義して、onEditorActionリスナをセットして、その中にイベントハンドル内容を書けば良い。

0 件のコメント:

コメントを投稿