EditDialogでAlertDialog.Builderを使用すると、ソフトキーボードがポップしない


117

EditDialogを入力メソッドとして、入力ボックスを作成するためにAlertDialog.Builderを使用しています。

残念ながら、もう一度タッチしない限り、EditTextにフォーカスがあっても、ソフトキーボードはポップしません。

強制的にポップさせる方法はありますか?

(AlertDialog.Builder).show();の後、次のことを試しましたしかし、役に立たない。

InputMethodManager mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
mgr.showSoftInput(input, InputMethodManager.SHOW_FORCED);

誰でも手伝ってくれる?

ありがとう!!


1
ソースコードをフォーマットしてください。
フィリップ

そして、私もあなたをupvote :)私は、複数の時間に同じ問題を検索していたとgrine4kaからの最後の答えは素晴らしい作品
フィリップ・

回答:


222

私はそんなものを作りました

AlertDialog.Builder b = new AlertDialog.Builder(this);//....
AlertDialog dialog = b.create();

dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);

dialog.show();

3
どうもありがとうございます。私はしばらく検索してきましたが、これがあなたの行きたい道です。すべてのOnFocusChangeListenerアプローチは私には多くのように思われ、問題を引き起こします。あなたは、作成する必要がありますAlertDialogからAlertDialog.Builder
フィリップ

これは本当に解決策ですか?これは、入力フィールドがあるかどうかに関係なく、入力フィールドにフォーカスがあるかどうかに関係なく、キーボードを強制的に表示するだけですよね?=)
Ted

@Tedあなたは正しいこれは本当の解決策ではありませんが、それは機能します。ダイアログにedittextがなく、ソフトキーボードが表示されなかった場合、私はそのようなことを試みました。
grine4ka 2013

1
私は実際になんとか "解決"(回避策)しています。EditTextにはsetOnFocusChangeListenerを使用し、フォーカスがあるかどうか( "hasFocus"変数)を確認する場合はonFocusChangeで、そうであればgetWindow()。setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);を実行します。
テッド

1
注:これを機能させるには、setSoftInputMode行を配置する必要があります。そうしないと機能しません。+1簡単な正しい解決策+1 dialog.show()
Spikatrix

29

私はそれをこのように解決することができました:

Dialog = builder.create();
Dialog.show();
Dialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE  | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
Dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);

23

同じコードがタブレットでも正しく機能することがわかりましたが、キーボードはポップアップしますが、電話ではポップアップしないので、さらに調査すると、「調整」オプションを指しているようです。

私はこれを使っています、ずっとすっきりした感じです。

AlertDialog d = builder.create();
d.getWindow().setSoftInputMode(
    WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
d.show();

ありがとう。これはを使用するよりも優れている必要がありますSOFT_INPUT_STATE_ALWAYS_VISIBLESOFT_INPUT_STATE_ALWAYS_VISIBLEダイアログのUIコンポーネント、ブロックしようとしているSOFT_INPUT_ADJUST_RESIZEサイズを変更し、ダイアログを「押し上げる」することができます。
Cheok Yan Cheng

10

私の場合、ダイアログが表示されたときにキーボードを表示できる唯一の方法は、に追加することでしたDialogFragment

@Override
public void onResume() {
    super.onResume();
    getDialog().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
    getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
    myEditText.requestFocus();
}

なお、SOFT_INPUT_STATE_ALWAYS_VISIBLEの代わりSOFT_INPUT_STATE_VISIBLEを

ドキュメントから:

int SOFT_INPUT_STATE_ALWAYS_VISIBLE
Visibility state for softInputMode: please always make the soft input area visible when this window receives input focus.

これは私にとって有効な唯一の解決策であり、私はそれらのロードを試しました。鉱山はalertdialogビルダーからのdialogfragmentビルドでした。重要なのは、上のコードをonResume()に配置することです。それ以外の場所ではうまくいきませんでした!
user960914 2018

6

showDialogを呼び出して、onCreateDialogのAlertDialogを使用して作成されたダイアログを表示する場合

ここにコードを配置する必要があります

    @Override
protected void onPrepareDialog (int id, Dialog dialog, Bundle args)
{
    TextView editText=(TextView) dialog.findViewById(R....);

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

}

5

より良い解決策がここに与えられています

dialog.getWindow().clearFlags(
         WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
        |WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);

回避策はありません。EditText期待どおりに動作します。


これは私にとってはうまくいきました、他の解決策はフォーカスをもたらしましたが、キーボードは表示されませんでした。
Akshay 2017

2
Window window = dialog.getWindow();
    window.clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
    window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

1

これはすでにここで答えられました。OnFocusChangeListenerを使用するとうまくいきました。


質問では、AlertDialog.Builderオブジェクトのソフト入力モードを設定する方法を尋ねますが、参照するスレッドはAlertDialogオブジェクトを使用した例を示しています。推奨されるコード(OnFocusChangeListener内でalert.getWindow()。setSoftInputMode(...)を使用)を使用しようとすると、メソッドgetWindow()がタイプAlertDialog.Builderに対して定義されていないEclipseオブジェクト。これを修正するのを手伝ってくれませんか。
prepbgg 2010年

1

私の場合、ダイアログを表示する前(作成後)に設定したときにSoftInputModeが表示されませんでした。以下のコードは、ダイアログを表示した後にSoftInputModeを設定する場合に機能しました。

コトリン:

val dialog = MaterialAlertDialogBuilder(context) // Other builder code
                .create()
dialog.show()
dialog.window?.apply { // After the window is created, get the SoftInputMode
    clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE)
    clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM)
    setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE)
}

Java:

AlertDialog dialog = MaterialAlertDialogBuilder(getContext()) // Other builder code
                .create();
dialog.show();
Window window = dialog.getWindow();
if(window != null){ // After the window is created, get the SoftInputMode
    window.clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
    window.clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
    window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}

これが私と同じ問題を抱えていた人に役立つことを願っています。


0

これを試してみてください

ソフトキーボードを表示したい場合:

InputMethodManager imm = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
                    imm.showSoftInput(input.getWindowToken(), 0);

そして、それを隠したい場合:

  InputMethodManager imm = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(input.getWindowToken(), 0);

0
final AlertDialog.Builder alert = new AlertDialog.Builder(context);

final AlertDialog dialog = alert.show();
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);

1
OPや将来の読者にとって回答がより有用になるので、コードにコンテキスト/説明を含めることをお勧めします。
EJoshuaS-2017年

0

この問題は、AlertDialog.onCreateが呼び出された後にEditTextが追加されると発生します。

https://developer.android.com/reference/androidx/appcompat/app/AlertDialog.Builder

AlertDialogクラスは、ダイアログのビューがView.onCheckIsTextEditor()からtrueを返すかどうかに基づいて、android.view.WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IMを自動的に設定します。

FLAG_ALT_FOCUSABLE_IMフラグをクリアする必要があります。

getWindow().clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); 

AlertDialog.showはDialogFragment.onStartで呼び出されるため、DialogFragment.onStartにコードを挿入できます。

@Override
public void onStart() {
    super.onStart();
    getDialog().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
}

または、DialogFragmentを使用しない場合は、Dialog.setOnShowListenerを使用できます。

dialog.setOnShowListener(new DialogInterface.OnShowListener() {
    @Override
    public void onShow(DialogInterface dialog) {
        getDialog().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
    }
});
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.