17

Para todos,NumberPicker en AlertDialog siempre activa el teclado. ¿Cómo deshabilitar esto?

Estoy tratando de hacer que un simple NumberPicker funcione en un AlertDialog. El problema es que cada vez que aumento/disminuyo el valor en el selector de números, el teclado se activa.

Hay muchas publicaciones que describen este problema, pero ninguna de las sugerencias funciona. que he intentado:

android:configChanges="keyboard|keyboardHidden" 

Y

inputManager.hideSoftInputFromWindow(currentView.getWindowToken(), 0); 

Y

getWindow().setSoftInputMode(
    WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); 

me han tratado de llamar a estas funciones antes y después de la inicialización (dialog.show()), en eventos de pulsación (usando oyentes obviamente), etc. pero hasta ahora no hay suerte.

El código completo:

popup.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" > 
    <NumberPicker 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/myNumber" 
     android:configChanges="keyboard|keyboardHidden" 
    /> 
</RelativeLayout> 

Y la función de llamada:

AlertDialog.Builder builder = new AlertDialog.Builder(this); 
builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { 
    public void onClick(DialogInterface dialog, int which) { 
     return; 
    } }); 
builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { 
    public void onClick(DialogInterface dialog, int which) { 
     return; 
    } }); 
View view = getLayoutInflater().inflate(R.layout.popup, null); 
builder.setView (view); 

final AlertDialog dialog = builder.create(); 
NumberPicker picker = (NumberPicker) view.findViewById(R.id.myNumber); 
picker.setMinValue(0); 
picker.setMaxValue(999); 

dialog.getWindow(). 
    setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); 
dialog.show();  

Cualquier ayuda apreciado

Barry

Respuesta

24

En realidad, aunque la solución anterior funciona perfectamente, hay una manera más fácil.

picker.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS); 

Esto es todo lo que se necesita. ¡¡¡¡De todos modos gracias por las respuestas!!!!:-)

+0

También puedes configurar esto en XML: android: descenddantFocusability = "blocksDescendants" – Borzh

1

la El atributo android:configChanges pertenece al archivo Manifest.xml, no al diseño. Pero si usted está ocultando el teclado a partir de ahí, usted es probablemente mejor de usar

android:windowSoftInputMode="stateAlwaysHidden" 

También debe tratar de utilizar getWindow() en su Activity en lugar de sólo la Dialog y ver si eso ayuda. Esta es probablemente la mejor solución, ya que la primera (que se esconde del manifiesto) mantendrá el teclado oculto durante toda la actividad.

+0

Hola Jave, Gracias por su respuesta y sus puntos de vista sobre Manifiesto vs XMLs de diseño. Sin embargo, la cuestión es que no puedo agregar estos parámetros al diseño, ya que el diseño es básicamente un formulario. El numberpicker es una ventana emergente (alertdialog) en este formulario y solo necesito deshabilitar el teclado en este diálogo, no toda la actividad. Esto es lo que ya mencionas por cierto :-) El getWindow sobre la actividad era algo que ya probé y desafortunadamente no ayuda – barrel

3

Dado que no hay acceso a los botones NumberPicker, es "imposible" de hacer.

Hice truco sucio rápido para manejarlo.

primero Añadir devorador de enfoque para el diseño, en este caso con el botón 0 Tamaño:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" > 
    <NumberPicker 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/myNumber" 
     android:configChanges="keyboard|keyboardHidden" 
     /> 
    <Button 
     android:id="@+id/myBtn" 
     android:layout_width="0dp" 
     android:layout_height="0dp" 
     /> 
</RelativeLayout> 

Tenemos que coger caso de hacer clic en los botones incement/decremento, elegí OnValueChangedListener, no podía encontrar algo mejor.

EditText edit = null; 
    try { 
     final Field[] fields = picker.getClass().getDeclaredFields(); 
     for (Field f : fields) { 
      if (EditText.class.equals(f.getType())) { 
       f.setAccessible(true); 
       edit = (EditText) f.get(picker); 
      } 
     } 
    } catch (IllegalAccessException e) { 
     e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. 
    } 
    if (edit != null) { 
     final EditText finalEdit = edit; 
     final InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
     picker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() { 
      @Override 
      public void onValueChange(NumberPicker numberPicker, int i, int i1) { 
       dialog.findViewById(R.id.myBtn).requestFocusFromTouch(); 
       imm.hideSoftInputFromWindow(finalEdit.getWindowToken(), 0); 
      } 
     }); 
    } 

Esto no es una solución recomendada. Espero que alguien encuentre algo mejor. Usar solo con fines educativos ;-)

+0

¡Guau, funciona como un encanto! Muchas gracias :-) – barrel

0

XML:

<NumberPicker 
    ... 
    android:descendantFocusability="blocksDescendants" /> 
Cuestiones relacionadas