Android の EditText の IME を制御する(1)

Android の IME はかなり幅をとるので、必要なときだけ起動しておきたい。作成したアプリケーション、 タカラモノデイズではユーザー入力を受け取るのに EditText を利用しているが、IME の制御が思った通りに行われない。望みの動作は、EditText にフォーカスを得たら IME が起動し、フォーカスを失ったら IME が終了すること。

まず、特に処理を加えず普通にコーディングしてみた。EditText がフォーカスを得ると IME が起動する。ここまでは問題ないが、EditText からフォーカスを奪うことができないので IME の終了は手動で行わなければならない。
具体的には、ユーザーが戻るボタンを押して IME を終了しなければならなかった。入力項目が1つしかなければ問題ないのだが、複数の入力項目があると IME で入力項目が隠れてしまい、次の入力項目に移動するのが難しい。レイアウトを工夫すればよいのかもしれないが、IME の処理を入れるのが一番最後だったので変更は面倒だ。
そこで、IME を制御するメソッドと、EditText の親の View をタップしたら EditText からフォーカスを奪うメソッドを用意してみた。まずは、IME を制御するメソッドを用意した。

IME を制御するには、InputMethodManager を利用する。表示する場合は、showSoftInput(View, int)を利用する。引数で渡している View は、IME を利用する EditText だ。int には、InputMethodManager の定数を利用する。強制的に表示するため、SHOW_FORCED を指定した。

public static void showInputMethodEditor(Context context, View view) {
	InputMethodManager inputMethodManager = (InputMethodManager) context
			.getSystemService(Context.INPUT_METHOD_SERVICE);
	inputMethodManager.showSoftInput(view, InputMethodManager.SHOW_FORCED);
}

非表示にする場合は、hideSoftInputFromWindow(IBinder, int)を利用する。定義したメソッドの引数で渡している View は表示するときと同様 IME を利用している EditText だ。hideSoftInputFromWindow の引数は、IBinder インタフェースを継承したトークンと、int のフラグを渡している。フラグは通常0で問題なく、ユーザーが明示的に表示した IME を非表示にしたくない場合のみ、ImputMethodManager.HIDE_IMPLICIT_ONLY を渡すようだ。

public static void hideInputMethodEditor(Context context, View view) {
	InputMethodManager inputMethodManager = (InputMethodManager) context
			.getSystemService(Context.INPUT_METHOD_SERVICE);
	inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0);
}

次回は、EditText の親の View をタップしたら EditText からフォーカスを奪うメソッドを定義する。


Android の EditText の IME を制御する(1)」への1件のフィードバック

  1. ピンバック: Android の EditText の IME を制御する(2) | UB Lab.

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

Time limit is exhausted. Please reload CAPTCHA.