cuando se usa AlertDialog.Builder con EditText, el teclado virtual no aparece

117

Estoy usando AlertDialog.Builder para crear un cuadro de entrada, con EditText como método de entrada.

Desafortunadamente, el teclado virtual no aparece, aunque EditText está enfocado, a menos que lo toque explícitamente nuevamente.

¿Hay alguna manera de forzarlo a reventar?

He intentado lo siguiente, después de (AlertDialog.Builder) .show (); pero en vano.

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

¿Alguien puede ayudar?

¡¡Gracias!!

niros
fuente
1
formatee su código fuente.
philipp
Luego también te voté :) Tuve el mismo problema de búsqueda durante varias horas y la última respuesta de grine4ka funciona muy bien
philipp

Respuestas:

222

He hecho tal cosa

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

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

dialog.show();
grine4ka
fuente
3
Muchas gracias. He buscado por un tiempo y esta es la forma en que quieres ir. Todos los OnFocusChangeListenerenfoques me parecen demasiado y me causan problemas. Tienes que crear el AlertDialogdesde el AlertDialog.Builder!
philipp
¿Es esta realmente una solución? Esto solo obliga al teclado a mostrar, independientemente de si hay un campo de entrada o no, independientemente de si el campo de entrada tiene el foco o no, ¿verdad? =)
Ted
@Ted, tienes razón, esta no es la solución real, pero funciona. He intentado hacer tal cosa si no hay texto de edición en el diálogo y no aparece el teclado virtual.
grine4ka
1
De hecho, me las arreglo para "resolverlo" (solución alternativa). Yo uso setOnFocusChangeListener para EditText, y en onFocusChange si verifico si tiene foco (la var "hasFocus") y si es así, hago getWindow (). SetSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
Ted
1
Nota: Para que esto funcione, debe colocar la setSoftInputModelínea antes dialog.show() o no funcionará. +1 para la solución correcta simple por cierto
Spikatrix
29

Me las arreglé para resolverlo así:

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
fuente
23

Descubrí que el mismo código funciona correctamente en la tableta, el teclado aparece, pero en el teléfono no, por lo que investigar más parece apuntar a la opción "ajustar".

Estoy usando esto, se siente mucho más limpio.

AlertDialog d = builder.create();
d.getWindow().setSoftInputMode(
    WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
d.show();
Phuah Yee Keat
fuente
Gracias. Esto es mejor que usarlo SOFT_INPUT_STATE_ALWAYS_VISIBLE. Como SOFT_INPUT_STATE_ALWAYS_VISIBLEva a bloquear los componentes de la interfaz de usuario del diálogo, donde SOFT_INPUT_ADJUST_RESIZEpodrá cambiar el tamaño y "empujar hacia arriba" el diálogo.
Cheok Yan Cheng
10

En mi caso, la única forma en que pude mostrar el teclado cuando se mostró el cuadro de diálogo fue agregando a mi 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();
}

Tenga en cuenta SOFT_INPUT_STATE_ALWAYS_VISIBLE en lugar de SOFT_INPUT_STATE_VISIBLE .

De la documentación:

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
fuente
Esta fue la única solución que funcionó para mí y había probado MUCHAS de ellas. La mía era una compilación de fragmentos de diálogo de alertdialog builder. Lo importante parecía ser colocar el código anterior en onResume (). ¡En cualquier otro lugar simplemente no funcionó!
user960914
6

Cuando llamas a showDialog para mostrar un diálogo creado usando AlertDialog en onCreateDialog

Deberías poner el código aquí

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

}
usuario590912
fuente
5

Aquí se da una solución mucho mejor .

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

Sin solución. EditTextse comporta como se esperaba.

sulai
fuente
Este funcionó para mí, la otra solución traía el foco pero no se mostraba el teclado.
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
fuente
1

Esto ya fue respondido aquí . Usar un OnFocusChangeListener funcionó para mí.

dhaag23
fuente
La pregunta pregunta cómo configurar el modo de entrada suave para un objeto AlertDialog.Builder, sin embargo, el hilo al que se refiere da un ejemplo usando un objeto AlertDialog. Si trato de usar el código sugerido (usando alert.getWindow (). SetSoftInputMode (...) dentro de OnFocusChangeListener) objetos Eclipse que el método getWindow () no está definido para el tipo AlertDialog.Builder. ¿Puedes ayudarme a arreglar esto, por favor?
prepbgg
1

En mi caso, no se mostraba SoftInputMode cuando lo configuré, que era antes de mostrar el cuadro de diálogo (después de crearlo). El siguiente código funcionó para mí donde configuré SoftInputMode después de mostrar el cuadro de diálogo.

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

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

Espero que esto ayude a cualquiera que tenga el mismo problema que yo.

AurumTechie
fuente
0

Prueba esto, funciona para mí

Si desea mostrar el teclado virtual:

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

Y si quieres ocultarlo:

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

final AlertDialog dialog = alert.show();
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
TonnyTao
fuente
1
Es mejor incluir algo de contexto / explicación con el código, ya que esto hace que la respuesta sea más útil para el OP y para los lectores futuros.
EJoshuaS - Reincorpora a Monica
0

Este problema se produce cuando se agrega EditText después de llamar a AlertDialog.onCreate.

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

La clase AlertDialog se encarga de configurar automáticamente android.view.WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM en función de si alguna de las vistas en el cuadro de diálogo devuelve verdadero desde View.onCheckIsTextEditor ().

Debes borrar la marca FLAG_ALT_FOCUSABLE_IM.

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

Dado que AlertDialog.show se llama en DialogFragment.onStart, puede insertar el código en DialogFragment.onStart.

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

O puede usar Dialog.setOnShowListener si no usa DialogFragment.

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