saat menggunakan AlertDialog.Builder dengan EditText, Soft Keyboard tidak muncul

117

Saya menggunakan AlertDialog.Builder untuk membuat kotak masukan, dengan EditText sebagai metode masukan.

Sayangnya, Soft Keyboard tidak muncul, meskipun EditText berada dalam fokus, kecuali Anda menyentuhnya lagi secara eksplisit.

Apakah ada cara untuk memaksanya agar meledak?

Saya sudah mencoba yang berikut ini, setelah (AlertDialog.Builder) .show (); tapi tidak berhasil.

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

Ada yang bisa membantu?

Terima kasih!!

niros
sumber
1
harap format kode sumber Anda.
philipp
Lalu saya upvote Anda juga :) Saya mengalami masalah pencarian yang sama selama beberapa jam dan jawaban terakhir dari grine4ka berfungsi dengan baik
philipp

Jawaban:

222

Saya telah membuat hal seperti itu

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

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

dialog.show();
grine4ka.dll
sumber
3
Terima kasih banyak. Saya telah mencari beberapa saat sekarang dan ini adalah cara yang Anda inginkan. Semua OnFocusChangeListenerpendekatan tampaknya banyak bagi saya dan menimbulkan masalah. Anda harus membuat AlertDialogdari AlertDialog.Builder!
philipp
Apakah ini benar-benar solusi? Ini hanya memaksa keyboard untuk ditampilkan, terlepas dari apakah ada kolom input atau tidak, terlepas dari apakah kolom input memiliki fokus atau tidak, bukan? =)
Ted
@Ted Anda benar, ini bukan solusi nyata, tetapi berhasil. Saya sudah mencoba melakukan hal seperti itu jika tidak ada teks edit dalam dialog, dan keyboard lunak tidak muncul.
grine4ka
1
Saya benar-benar berhasil "menyelesaikannya" (solusi). Saya menggunakan setOnFocusChangeListener untuk EditText, dan di onFocusChange jika memeriksa apakah memiliki fokus (var "hasFocus") dan jika demikian, saya melakukan getWindow (). SetSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
Ted
1
Catatan: Agar ini berfungsi, Anda perlu menempatkan setSoftInputModegaris sebelumnya dialog.show() atau itu tidak akan berhasil. 1 untuk solusi sederhana yang benar btw
Spikatrix
29

Saya sudah berhasil menyelesaikannya seperti ini:

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);
Alex Fragotsis
sumber
23

Saya menemukan bahwa kode yang sama berfungsi dengan baik di Tablet, keyboard muncul, tetapi di Ponsel tidak, jadi meneliti lebih lanjut, tampaknya mengarah ke opsi "sesuaikan".

Saya menggunakan ini, terasa jauh lebih bersih.

AlertDialog d = builder.create();
d.getWindow().setSoftInputMode(
    WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
d.show();
Phuah Yee Keat
sumber
Terima kasih. Ini harus lebih baik daripada menggunakan SOFT_INPUT_STATE_ALWAYS_VISIBLE. Seperti SOFT_INPUT_STATE_ALWAYS_VISIBLEakan memblokir dialog komponen UI, di mana SOFT_INPUT_ADJUST_RESIZEdapat mengubah ukuran dan "mendorong" dialog.
Cheok Yan Cheng
10

Dalam kasus saya, satu-satunya cara saya dapat menampilkan keyboard saat Dialog ditampilkan adalah dengan menambahkan ke 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();
}

Catat SOFT_INPUT_STATE_ALWAYS_VISIBLE, bukan SOFT_INPUT_STATE_VISIBLE .

Dari dokumentasi:

int SOFT_INPUT_STATE_ALWAYS_VISIBLE
Visibility state for softInputMode: please always make the soft input area visible when this window receives input focus.
vovahost
sumber
Ini adalah satu-satunya solusi yang berhasil untuk saya dan saya telah mencoba BEBAN dari mereka. Punyaku adalah dialogfragment yang dibangun dari alertdialog builder. Bit penting sepertinya menempatkan kode di atas di onResume (). Di tempat lain itu tidak berhasil!
pengguna960914
6

Saat Anda memanggil showDialog untuk menampilkan Dialog yang dibuat menggunakan AlertDialog di onCreateDialog

Anda harus meletakkan kodenya di sini

    @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);
         }
       }
    });

}
pengguna590912
sumber
5

Solusi yang jauh lebih baik diberikan di sini .

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

Tidak ada solusi. EditTextberperilaku seperti yang diharapkan.

sulai
sumber
Yang ini berhasil untuk saya, solusi lainnya membawa fokus tetapi keybord tidak ditampilkan.
Akshay
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);
Mohammed Shoeb
sumber
1

Ini sudah terjawab di sini . Menggunakan OnFocusChangeListener berhasil untuk saya.

dhaag23
sumber
Pertanyaan tersebut menanyakan cara menyetel mode masukan lunak untuk objek AlertDialog.Builder, namun utas yang Anda rujuk memberikan contoh menggunakan objek AlertDialog. Jika saya mencoba menggunakan kode yang disarankan (menggunakan alert.getWindow (). SetSoftInputMode (...) dalam OnFocusChangeListener) objek Eclipse bahwa metode getWindow () tidak ditentukan untuk tipe AlertDialog.Builder. Bisakah Anda membantu saya memperbaikinya?
prepbgg
1

Dalam kasus saya, SoftInputMode tidak ditampilkan ketika saya mengaturnya sebelum menampilkan dialog (setelah membuatnya). Kode di bawah ini berfungsi untuk saya di mana saya mengatur SoftInputMode setelah menampilkan dialog.

Kotlin:

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)
}

Jawa:

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);
}

Saya harap ini membantu siapa saja yang mengalami masalah yang sama dengan saya.

AurumTechie
sumber
0

Coba ini, ini berhasil untuk saya

Jika Anda ingin menampilkan soft keyboard:

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

Dan jika Anda ingin menyembunyikannya:

  InputMethodManager imm = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(input.getWindowToken(), 0);
Yogesh Rathi
sumber
0
final AlertDialog.Builder alert = new AlertDialog.Builder(context);

final AlertDialog dialog = alert.show();
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
TonnyTao
sumber
1
Lebih baik memasukkan beberapa konteks / penjelasan dengan kode karena ini membuat jawaban lebih berguna untuk OP dan untuk pembaca selanjutnya.
EJoshuaS
0

Masalah ini terjadi ketika EditText ditambahkan setelah AlertDialog.onCreate dipanggil.

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

Kelas AlertDialog menangani setelan otomatis android.view.WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM untuk Anda berdasarkan apakah ada tampilan dalam dialog yang mengembalikan true dari View.onCheckIsTextEditor ().

Anda perlu menghapus bendera FLAG_ALT_FOCUSABLE_IM.

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

Karena AlertDialog.show dipanggil di DialogFragment.onStart, Anda dapat memasukkan kode di DialogFragment.onStart.

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

Atau Anda dapat menggunakan Dialog.setOnShowListener jika Anda tidak menggunakan DialogFragment.

dialog.setOnShowListener(new DialogInterface.OnShowListener() {
    @Override
    public void onShow(DialogInterface dialog) {
        getDialog().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
    }
});
Taman Sungsuh
sumber