ソフトキーボードを非表示にする
|EditTextにテキストを入力しようとするとソフトキーボードが表示されますが、
EditTextのフォーカスが外れてもソフトキーボードが非表示にならずに、次の操作の邪魔になってしまう場合があります。
今回はEditTextのフォーカスが外れたときにソフトキーボードを非表示にする方法についてご紹介したいと思います。
詳細は続きからどうぞ。
フォーカスの状態変化を検知する
まず、EditTextのフォーカスが外れたことを検知するための仕組みが必要になります。
これにはonFocusChangedコールバックメソッドを利用します。
onFocusChangedコールバックメソッドはEditTextなどのビューがフォーカスされた、
あるいはフォーカスが外れたのをトリガーに呼び出されるメソッドです。
void onFocusChange(View v, boolean hasFocus)
引数のvにはフォーカス状態が変化したView、hasFocusにはフォーカスの状態が格納されます。
hasFocusを見ればフォーカスの状態を判別できますので、フォーカスが外れたときに目的の処理を行えば良いことになります。
1 2 3 4 5 6 7 8 9 10 | EditText et = (EditText) findViewById(R.id.editText1); et.setOnFocusChangeListener( new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { // EditTextのフォーカスが外れた場合 if (hasFocus == false ) { // 処理を行う } } }); |
ソフトキーボードを非表示にする
ソフトキーボードを非表示にするにはInputMethodManagerを取得して、
hideSoftInputFromWindowメソッドを呼び出します。
boolean hideSoftInputFromWindow(IBinder windowToken, int flags)
引数にはwindowTokenにウィンドウの識別子、flagsにソフトキーボードの非表示設定フラグを指定します。
flagsに指定できる値は以下の2つがあります。
・HIDE_IMPLICIT_ONLY : 予測変換表示のみ非表示にして、ソフトキーボード自体は表示したままにする
・HIDE_NOT_ALWAYS : 予測変換表示もソフトキーボードも非表示にする
今回のケースではソフトキーボードを完全に非表示にしたいので、HIDE_NOT_ALWAYSを指定します。
サンプル
サンプルではEditTextからButtonにフォーカスが移ったときに、ソフトキーボードを非表示にさせています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | @Override public void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.main); button = (Button) findViewById(R.id.button1); button.setOnClickListener( this ); et = (EditText) findViewById(R.id.editText1); et.setOnFocusChangeListener( new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { // EditTextのフォーカスが外れた場合 if (hasFocus == false ) { // ソフトキーボードを非表示にする InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(v.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); } } }); } @Override public void onClick(View v) { // ボタンにフォーカスを移動させる button.setFocusable( true ); button.setFocusableInTouchMode( true ); button.requestFocus(); } |