Kuwapp's Blog

Android と Flutter やってます

【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"

参考

ソフトキーボードを非表示にする « Tech Booster