Estoy tratando de desactivar el teclado virtual cuando uso un NumberPicker para ingresar valores numéricos (por razones estéticas). Este es mi código xml de diseño:
<?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 trato de bloquear el teclado en el método onCreate ():
// 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 virtual sigue apareciendo al hacer clic en un NumberPicker. ¿Algunas ideas?
Versión XML de la respuesta de Andrew Webber
Ejemplo
fuente
Después de leer el código fuente com / android / internal / widget / NumberPicker.java, obtuve la siguiente solución:
fuente
Simplemente mejoré la respuesta de @MaxVogler (así que si quieres votar este voto también en @MaxVogler) y conviértela en un hack robusto. Además no necesitamos llamar
setOnFocusChangeListener
ysetInputType
. SolosetFocusable
a falso hará.A continuación se muestra una API de ayuda para habilitar / deshabilitar la función
fuente
Aquí hay otra forma de hacerlo que permite al usuario editar un número si lo desea: simplemente suprime el teclado virtual inicialmente. Use
NumberPicker.setDescendantFocusability(FOCUS_BLOCK_DESCENDANTS)
para suprimir el teclado virtual cuando la interfaz se muestra por primera vez según las respuestas anteriores. Luego obtenga su diálogo o actividad para implementarView.OnTouchListener
, llamesetOnTouchListener(this)
a suNumberPicker
, y en su implementación,onTouch(View v,MotionEvent e)
restablezca la capacidad de enfoque descendiente del selector numérico a su valor normal, luego devuelva falso.Devolver falso significa que el TouchPicker aún procesa el toque, lo que significa que si el usuario toca el cuadro de edición, aparece el teclado virtual. Esto es exactamente lo que quería enfrentar con el mismo problema: hacer que el teclado virtual aparezca con el cuadro de diálogo cuando se muestra por primera vez es desagradable ya que cambia el cuadro de diálogo hacia arriba después de que aparece.
después de crear el Diálogo en el
onCreateDialog()
método y encontrar el NumberPicker:y aquí está el método OnTouch:
fuente
Lo más simple que encontré para trabajar fue:
fuente
Si solo desea ocultar el teclado del software al cargar la vista con su selector de números, pero aún desea que los usuarios puedan editar después de que se carga la vista, entonces no debe bloquear la capacidad de enfoque descendente. En cambio, solo evite que el selector de números sea el primer elemento enfocado en su vista.
Ver esta respuesta para más detalles.
Basado en la respuesta anterior:
fuente
No sé por qué funciona, pero configurar OnClickListener, que no hace nada, impidió que se mostrara el teclado (Lollipop)
fuente
* llamando a esto:
no bloqueará la capacidad de enfoque descendente (el selector de números será editable)
ocultará la entrada suave al crear
antes (procesamiento de entrada) getValue () permitirá obtener la walue adecuada
fuente
Código de trabajo de forma programática:
XML:
fuente