がぶちゃんの日記

札幌からフルリモートCTO

EditTextを持つダイアログ(AlertDialog)が表示された時に自動的にソフトキーボードを表示する。

ソフトキーボードは以下のメソッドで表示できるそうです。

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

しかし、ダイアログの場合は、タイミングが悪いのか思い通りに表示されません。

上記は、Activity の getWindow() メソッドですが、getWindow() メソッドは、Dialog クラスにもあります。こちらの getWindow() メソッドを使うと思い通りに表示されます。

以下は、EditText がフォーカスされたタイミングでソフトキーボードを表示する例です。非同期な OnFocusChangeListener から参照されるので alertDialog は final になります。

private void showDialog() {
    EditText editText = new EditText(this);

    final AlertDialog alertDialog = new AlertDialog.Builder(this)
        .setTitle("Dialog test")
        .setView(editText)
        .setPositiveButton("OK", null)
        .create();

    editText.setOnFocusChangeListener(new OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (hasFocus) {
                alertDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
            }
        }
    });

    alertDialog.show();
}