Estoy tratando de desactivar el teclado de software cuando se utiliza un NumberPicker para introducir valores numéricos (por razones estéticas). Este es mi esquema de xml-código:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:id="@+id/linearLayout2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_marginBottom="30dp"
        android:layout_marginTop="30dp" >

        <NumberPicker
            android:id="@+id/repetitionPicker"
            android:layout_width="40dp"
            android:layout_height="wrap_content" />

        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:text="@string/repetitions_short_divider"
            android:textAppearance="?android:attr/textAppearanceMedium" />

        <NumberPicker
            android:id="@+id/weightPicker"
            android:layout_width="40dp"
            android:layout_height="wrap_content"
            android:layout_marginLeft="40dp" />

        <TextView
            android:id="@+id/textView2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:text="@string/pounds"
            android:textAppearance="?android:attr/textAppearanceMedium" />
    </LinearLayout>


    <Button
        android:id="@+id/saveButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="@string/save" />

</LinearLayout>

Y finalmente este es el código donde intento para bloquear el teclado en el onCreate()-método:

//hide keyboard
View.OnClickListener disableKeyBoardListener = new View.OnClickListener() {
    public void onClick(View v) {
        ((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE))
                .hideSoftInputFromWindow(v.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
    }
};

((EditText) weightPicker.getChildAt(1)).setInputType(InputType.TYPE_NULL);
((EditText) repetitionPicker.getChildAt(1)).setInputType(InputType.TYPE_NULL);

((EditText) weightPicker.getChildAt(1)).setOnClickListener(disableKeyBoardListener);
//((EditText) repetitionPicker.getChildAt(1)).setOnClickListener(disableKeyBoardListener);
//weightPicker.setOnClickListener(disableKeyBoardListener);
//repetitionPicker.setOnClickListener(disableKeyBoardListener);     

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

Lamentablemente, el teclado de software todavía se muestra al hacer clic en un NumberPicker. Alguna idea?

InformationsquelleAutor damaxxed | 2012-01-13

10 Comentarios

  1. 457

    Acabo de encontrar esta y funciona como un encanto:

    myNumberPicker.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);

    También puede establecer esta en XML:

    android:descendantFocusability="blocksDescendants" 
    • A menos que me estoy perdiendo algo, esto elimina la posibilidad de escribir en un valor para el NumberPicker. No es necesariamente una mala cosa, dependiendo de cómo se está utilizando el selector, pero parece ser una limitación de la solución.
    • También puede establecer esta en XML: android:descendantFocusability=»blocksDescendants»
    • Aaah,blocksDescendants, por supuesto. Muchas gracias 🙂
    • Increíble solución, me salvó!
  2. 53

    Xml versión de Andrew Webber respuesta

    android:descendantFocusability="blocksDescendants"

    Ejemplo

    <NumberPicker
            android:id="@+id/your_numberpicker"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:descendantFocusability="blocksDescendants"/>
  3. 7

    Después de la lectura a través de la com/android/internal/widget/NumberPicker.java código fuente llegué a la siguiente solución:

    //Hide soft keyboard on NumberPickers by overwriting the OnFocusChangeListener
    OnFocusChangeListener fcl = new OnFocusChangeListener() {
        public void onFocusChange(View v, boolean hasFocus) {
            //Do nothing to suppress keyboard
        }
    };
    
    ((EditText) numberPicker.getChildAt(1)).setOnFocusChangeListener(fcl);
    
    //Suppress soft keyboard from the beginning
    ((EditText) numberPicker.getChildAt(1)).setInputType(InputType.TYPE_NULL);
    • Bien su tipo de un ataque de la derecha?
    • Sí, tuve que editar directamente el niño vistas de la NumberPicker. El Android API es muy escasa, a veces.
    • +1 para encontrar el hack…:)
  4. 6

    Sólo ha mejorado la @MaxVogler ‘s ans (así que si wannt votación este voto @MaxVogler demasiado) y hacer un robusto hack. También no es necesario llamar a setOnFocusChangeListener y setInputType. Sólo setFocusable a false hacer.

    A continuación es un auxiliar de la api para activar/desactivar la función de

    public static void enableNumberPickerManualEditing(NumberPicker numPicker,
            boolean enable) {
        int childCount = numPicker.getChildCount();
    
        for (int i = 0; i < childCount; i++) {
            View childView = numPicker.getChildAt(i);
    
            if (childView instanceof EditText) {
                EditText et = (EditText) childView;
                et.setFocusable(enable);
                return;
            }
        }
    }
  5. 4

    He aquí otra manera de hacerlo que permite al usuario editar un número si quieren, sólo se suprime el teclado suave al principio. Uso NumberPicker.setDescendantFocusability(FOCUS_BLOCK_DESCENDANTS) para suprimir el teclado cuando la interfaz se muestra primero como por las respuestas anteriores. A continuación, el diálogo o la actividad a implementar View.OnTouchListener, llamada setOnTouchListener(this) en su NumberPicker, y en la implementación de onTouch(View v,MotionEvent e) restablecer el numberpicker descendiente focusability a su valor normal, a continuación, devuelve falso.

    Devolver false significa que el contacto está siendo procesado por el NumberPicker, lo que significa que si el usuario pulsa en el cuadro de edición el teclado viene. Esto pasa a ser exactamente lo que yo quería enfrenta con el mismo problema – tener el teclado viene con el cuadro de diálogo cuando la primera muestra es desagradable como se cambia el cuadro de diálogo hasta después de que aparezca.

    public class GetBufferDialog extends DialogFragment implements View.OnTouchListener {

    después de crear el cuadro de Diálogo en el onCreateDialog() método y la búsqueda de la NumberPicker:

    m_oldFocus = m_numberpicker.getDescendantFocusability();
    m_numberpicker.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS); 
    m_numberpicker.setOnTouchListener(this);

    y aquí está el método OnTouch:

    public boolean onTouch(View v, MotionEvent event) {
        m_numberpicker.setDescendantFocusability(m_oldFocus);
        return false;
    }
    • solo que esta me ha ayudado a resolver mi problema, gracias por su enfoque
  6. 2

    La más sencilla que he encontrado de trabajo fue :

    numberPicker               = (NumberPicker) myDialogView.findViewById(R.id.myViewId);
    EditText numberPickerChild = (EditText) numberPicker.getChildAt(0);
    numberPickerChild.setFocusable(false);
    numberPickerChild.setInputType(InputType.TYPE_NULL);
    • Muchas gracias!!!! He probado de todo sin resultado, pero esto funciona bien…
  7. 1

    No sé por qué funciona, pero la configuración de OnClickListener que no hace nada impidió que el teclado de la muestra (Lollipop)

    numberPicker.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View view) {
      }
    });
  8. 1

    Si sólo desea ocultar el teclado software cuando se carga la vista con su número de selector, pero aún desea que los usuarios puedan editar después de la vista se carga, entonces usted no debe bloquear descendiente focusability. En su lugar, sólo evitar que el número de selector de ser el primero centrado en el elemento de la vista.

    Ver esta respuesta para más detalles.

    Basado en la respuesta anterior:

        <!-- Dummy item to prevent Number Picker from receiving focus -->
        <LinearLayout        
            android:focusable="true" 
            android:focusableInTouchMode="true"
            android:layout_width="0px" 
            android:layout_height="0px"/>
    
        <!-- :nextFocusUp and :nextFocusLeft have been set to the id of this component 
             to prevent the dummy from receiving focus again -->
        <NumberPicker 
            android:id="@+id/number_picker"
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content"
            android:nextFocusUp="@id/number_picker" 
            android:nextFocusLeft="@id/number_picker"/>
  9. 0
    /**
     * set focus to top level window
     * disposes descendant focus
     * disposes softInput
     * @param context - activity context
     * @param enable - state of focus
     * */
    public static void topLevelFocus(Context context, boolean enable){
        if(Activity.class.isAssignableFrom(context.getClass())){
            ViewGroup tlView = (ViewGroup) ((Activity) context).getWindow().getDecorView();
            if(tlView!=null){
                tlView.setFocusable(enable);
                tlView.setFocusableInTouchMode(enable);
                tlView.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS);
                tlView.requestFocus();
            }
        }
    }

    * llamar a este:

    • no bloquear descendiente focusability (numberpicker será editable)

    • ocultar suave entrada en crear

    • antes (procesamiento de la entrada). getValue() permitirá conseguir un correcto walue


  10. 0

    Código de trabajo
    A través de programación :

    mp.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);

    XML:

    android:descendantFocusability="blocksDescendants" 

Dejar respuesta

Please enter your comment!
Please enter your name here