quando si utilizza AlertDialog.Builder con EditText, la tastiera virtuale non si apre


117

Sto usando AlertDialog.Builder per creare una casella di input, con EditText come metodo di input.

Sfortunatamente, la tastiera morbida non si apre, sebbene l' EditText sia a fuoco, a meno che non lo tocchi di nuovo esplicitamente.

C'è un modo per forzarlo a scoppiare?

Ho provato quanto segue, dopo (AlertDialog.Builder) .show (); ma senza alcun risultato.

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

Qualcuno può aiutare?

Grazie!!


1
si prega di formattare il codice sorgente.
philipp

Quindi ho votato anche te :) Ho avuto lo stesso problema di ricerca per più ore e l'ultima risposta di grine4ka funziona alla grande
philipp

Risposte:


222

Ho fatto una cosa del genere

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

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

dialog.show();

3
Grazie mille. Ho cercato per un po 'e questo è il modo in cui vuoi andare. Tutti gli OnFocusChangeListenerapprocci mi sembrano troppo e causano problemi. Devi creare AlertDialogdal AlertDialog.Builder!
philipp

Questa è davvero una soluzione? Questo costringe la tastiera a mostrare, indipendentemente dal fatto che sia presente o meno un campo di input, indipendentemente dal fatto che il campo di input sia attivo o meno, giusto? =)
Ted

@Ted hai ragione questa non è la vera soluzione, ma funziona. Ho provato a fare una cosa del genere se non è presente un testo di modifica nella finestra di dialogo e la tastiera virtuale non è visualizzata.
grine4ka

1
In realtà riesco a "risolverlo" (soluzione alternativa). Uso setOnFocusChangeListener per EditText, e in onFocusChange se controllo se ha il focus (il var "hasFocus") e in tal caso, getWindow (). SetSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
Ted

1
Nota: affinché funzioni, è necessario posizionare la setSoftInputModelinea prima dialog.show() o non funzionerà. +1 per la semplice soluzione corretta btw
Spikatrix

29

Sono riuscito a risolverlo in questo modo:

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

Ho scoperto che lo stesso codice funziona correttamente su Tablet, la tastiera si apre, ma su Phone no, quindi effettuando ulteriori ricerche, sembra puntare all'opzione "regola".

Lo sto usando, sembra molto più pulito.

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

Grazie. Questo è meglio che usare SOFT_INPUT_STATE_ALWAYS_VISIBLE. Come SOFT_INPUT_STATE_ALWAYS_VISIBLEsta per bloccare i componenti dell'interfaccia utente della finestra di dialogo, dove è SOFT_INPUT_ADJUST_RESIZEpossibile ridimensionare e "spingere verso l'alto" la finestra di dialogo.
Cheok Yan Cheng

10

Nel mio caso l'unico modo in cui sono stato in grado di mostrare la tastiera quando è stata mostrata la finestra di dialogo è stato aggiungendo al mio 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();
}

Notare SOFT_INPUT_STATE_ALWAYS_VISIBLE invece di SOFT_INPUT_STATE_VISIBLE .

Dalla documentazione:

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

Questa era l'unica soluzione che ha funzionato per me e avevo provato LOADS di loro. Il mio era un dialogfragment creato da alertdialog builder. La parte importante sembrava essere collocare il codice sopra in onResume (). In qualsiasi altro luogo semplicemente non ha funzionato!
user960914

6

Quando chiami showDialog per mostrare un dialogo creato utilizzando AlertDialog in onCreateDialog

Dovresti inserire il codice qui

    @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

Una soluzione molto migliore è dato qui .

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

Nessuna soluzione alternativa. EditTextsi comporta come previsto.


Questo ha funzionato per me, l'altra soluzione stava portando il focus ma la tastiera non veniva visualizzata.
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);

1

Questo è stato già risposto qui . L'utilizzo di un OnFocusChangeListener ha funzionato per me.


La domanda chiede come impostare la modalità di input software per un oggetto AlertDialog.Builder, tuttavia il thread a cui si fa riferimento fornisce un esempio utilizzando un oggetto AlertDialog. Se provo a utilizzare il codice suggerito (utilizzando alert.getWindow (). SetSoftInputMode (...) all'interno di OnFocusChangeListener) Eclipse oggetti che il metodo getWindow () non è definito per il tipo AlertDialog.Builder. Puoi aiutarmi a risolvere questo problema, per favore?
prepbgg

1

Nel mio caso, SoftInputMode non veniva visualizzato quando l'ho impostato prima di mostrare la finestra di dialogo (dopo averlo creato). Il codice seguente ha funzionato per me dove ho impostato SoftInputMode dopo aver mostrato la finestra di dialogo.

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

Giava:

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

Spero che questo aiuti chiunque abbia avuto il mio stesso problema.


0

Prova questo, funziona per me

Se desideri visualizzare la tastiera virtuale:

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

E se vuoi nasconderlo:

  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
È meglio includere un contesto / spiegazione con il codice in quanto ciò rende la risposta più utile per l'OP e per i lettori futuri.
EJoshuaS - Ripristina Monica il

0

Questo problema si verifica quando EditText viene aggiunto dopo la chiamata di AlertDialog.onCreate.

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

La classe AlertDialog si occupa di impostare automaticamente android.view.WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM in base al fatto che le visualizzazioni nella finestra di dialogo restituiscano true da View.onCheckIsTextEditor ().

Devi cancellare il flag FLAG_ALT_FOCUSABLE_IM.

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

Poiché AlertDialog.show viene chiamato in DialogFragment.onStart, è possibile inserire il codice in DialogFragment.onStart.

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

Oppure puoi usare Dialog.setOnShowListener se non usi DialogFragment.

dialog.setOnShowListener(new DialogInterface.OnShowListener() {
    @Override
    public void onShow(DialogInterface dialog) {
        getDialog().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
    }
});
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.