目的

EditText以外の部分をタップしてキーボードを閉じる処理のメモ
個人的に結構厄介な設定だと思いました。

親のレイアウトによって、設定が変わりますし、Fragment上でもさらに設定方法が変わるようです。


バージョン

Android Studio 3.5

実装方法

ActivityでのJavaコードは以下となりました。
画面外タップをonTouchEventで判定し、他オブジェクトにフォーカスを当てて、
キーボードを閉じるようにするので、onTouchEventも必要です。

public class MainActivity extends AppCompatActivity {
​
    private TextView view;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
​
        view = findViewById(R.id.idtext);
​
        EditText edittext = findViewById(R.id.registinheritEdit1);
        edittext.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if(!hasFocus) {
                    //キーボード非表示
                    InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
                    if (imm != null) {
                        imm.hideSoftInputFromWindow(v.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
                    }
                }
            }
        });
    }
​
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        view.requestFocus();
        return super.onTouchEvent(event);
    }
}


ただ、親LayoutがdrawerlayoutListViewとかですonTouchEventが呼ばれないようです。
その時はdispatchTouchEventを利用します。

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    view.requestFocus();
    return super.dispatchTouchEvent(ev);
}



またFragmentの場合はTouchEventが呼ばれないようなので、
onCreateViewで、以下の設定をするべきと思いました。

view.setOnTouchListener(new View.OnTouchListener() {
    public boolean onTouch(View v, MotionEvent event) {
        if(event.getAction() == MotionEvent.ACTION_MOVE){
        }
        return true;
    }
});


xmlは以下とします。
ダミーとなるTextView
android:focusable="true"android:focusableInTouchMode="true" が必要だと思います。

<TextView
    android:id="@+id/view"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:focusable="true"
    android:focusableInTouchMode="true"
    tools:ignore="MissingConstraints" />
<EditText
    android:id="@+id/edittext"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="100dp"
    app:layout_constraintTop_toTopOf="parent" />





スッキリわかるJava入門 第2版 (スッキリシリーズ)