【Android】画面タップでキーボードを非表示にする
画面タップでキーボードを非表示するよくある実装です。
アクティビティ
public class MainActivity extends ActionBarActivity { private View mFocusView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mFocusView = findViewById(R.id.focusView); mFocusView.requestFocus(); EditText editText = (EditText)findViewById(R.id.editText); editText.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if(!hasFocus) { // フォーカスが外れた場合キーボードを非表示にする InputMethodManager inputMethodMgr = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE); inputMethodMgr.hideSoftInputFromWindow(v.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); } } }); } @Override public boolean onTouchEvent(MotionEvent event) { mFocusView.requestFocus(); return super.onTouchEvent(event); } }
レイアウト
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/focusView" android:layout_width="0dp" android:layout_height="0dp" android:focusable="true" android:focusableInTouchMode="true"/> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/editText" /> </RelativeLayout>
説明
onTouchEventをオーバライドして画面タップをフックし、フォーカスを移すために用意したView(今回は幅と高さを0dpにしたTextView)にフォーカスを移します。
EditTextのOnFocusChangeListenerはフォーカスに変更があった場合に呼ばれるので
フォーカスが外れた場合キーボードを非表示にします。
requestFocusでフォーカスを移すにはxmlで以下を定義する必要があるのでお忘れなく。
android:focusable="true" android:focusableInTouchMode="true"
参考