IMEが表示されている状態ではActivity#onBackPressed()
は呼ばれないのでここでEditText
のフォーカスを外すことはできません。
EditText
のフォーカスをはずすにはEditText
を拡張します:
MyEditText.java
package com.example.android.sampleapp;
import android.content.Context;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.view.View;
import android.widget.EditText;
public class MyEditText extends EditText {
public MyEditText(Context context) {
super(context);
}
public MyEditText(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyEditText(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public boolean onKeyPreIme(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) {
View parent = (View) getParent();
parent.setFocusable(true);
parent.setFocusableInTouchMode(true);
parent.requestFocus();
}
return super.onKeyPreIme(keyCode, event);
}
}
注) Support Libraryを利用している場合は、AppCompat
系のクラスを親クラスにすることが推奨されていたりします。例えばEditText
はAppCompatEditText
です。
あとは適当にレイアウトxmlに追加すればokです。
ポイントは、
parent.setFocusable(true);
parent.setFocusableInTouchMode(true);
でparentにフォーカスを当てられる状態にしてからrequestFocus()
を呼ぶことです。こうしなければparentにフォーカスが移動しないのでEditText
にフォーカスが残ったままになります。
また、onKeyPreIme
の名のごとく、このメソッドはIMEが閉じるよりも前に呼ばれますので、superクラスのonKeyPreIme(int, KeyEvent)
を呼んであげなければ、IMEは開いたままになります(InputMethodManager
を通して自分で閉じてやればいいですが)。