2010-08-11 14 views
91

Estoy usando AlertDialog.Builder para crear un cuadro de entrada, con EditText como método de entrada.cuando se usa AlertDialog.Builder con EditText, el Teclado suave no aparece

Desafortunadamente, el Teclado suave no aparece, aunque el EditText está en foco, a menos que lo toque explícitamente de nuevo.

¿Hay alguna manera de forzarlo a explotar?

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

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

Cualquiera puede ayudar?

Gracias!

+1

favor formato a su código fuente. – philipp

+0

Luego, también te he votado mejor :) Tuve la misma búsqueda de problemas durante varias horas y la última respuesta de grine4ka funciona bien – philipp

Respuesta

1

Ya fue respondida here. Usar un OnFocusChangeListener funcionó para mí.

+0

La pregunta es 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) Eclipse objeta que el método getWindow() no está definido para el tipo AlertDialog.Builder. ¿Puedes ayudarme a solucionar esto, por favor? – prepbgg

5

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

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

} 
182

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(); 
+3

Muchas gracias. He buscado por un tiempo y esta es la forma en que quieres ir. Todos los enfoques 'OnFocusChangeListener' me parecen demasiado y causan problemas. ¡Tienes que crear el 'AlertDialog' del' AlertDialog.Builder'! – philipp

+0

¿Es ésta realmente una solución? Esto solo obliga al teclado a mostrarse, independientemente de si hay un campo de entrada o no, sin tener en cuenta si el campo de entrada tiene foco o no, ¿no? =) – Ted

+0

@Ted tiene 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 cuadro de diálogo, y no apareció el teclado virtual. – grine4ka

4

Una gran parte mejor solución se da here.

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

Sin solución. EditText se comporta como se esperaba.

+0

Este me funcionó, la otra solución estaba enfocando, pero no se mostró el teclado. – Akshay

21

he logrado resolver de esta manera:

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

descubrí que el mismo código funciona correctamente en la tableta, el teclado pop-up, pero en el teléfono no lo hace, por lo que la investigación aún 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(); 
+0

Gracias. Esto es mejor que usar 'SOFT_INPUT_STATE_ALWAYS_VISIBLE'. Como 'SOFT_INPUT_STATE_ALWAYS_VISIBLE' va a bloquear los componentes de la interfaz de usuario del diálogo, donde' SOFT_INPUT_ADJUST_RESIZE' puede cambiar el tamaño y "empujar hacia arriba" el cuadro de diálogo. –

0

Prueba de esto, su trabajo para mí

Si desea ver el teclado suave:

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

Y si desea ocultar el árbitro:

InputMethodManager imm = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); 
      imm.hideSoftInputFromWindow(input.getWindowToken(), 0); 
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); 
0
final AlertDialog.Builder alert = new AlertDialog.Builder(context); 

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

Es mejor incluir algún contexto/explicación con el código, ya que hace que la respuesta sea más útil para el OP y para los lectores futuros. – EJoshuaS

3

En mi caso, la única manera de que era capaz de mostrar el teclado cuando el diálogo se mostró fue añadiendo 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(); 
} 

Nota del 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. 
+0

Esta fue la única solución que funcionó para mí y yo había probado LOADS de ellos. El mío fue una compilación de fragmentos de diálogo a partir del generador de alertas de diálogo. El bit importante parecía estar colocando el código anterior en onResume(). ¡En cualquier otro lugar, simplemente no funcionó! – user960914

Cuestiones relacionadas