android - swiftkey - Deshabilitar el teclado virtual en NumberPicker
teclado letras grandes (8)
Intento desactivar el teclado virtual cuando uso un NumberPicker para ingresar valores numéricos (por razones estéticas). Este es mi layout-xml-code:
<?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 suave aún aparece cuando se hace clic en un NumberPicker. ¿Algunas ideas?
Acabo de encontrar esto y funciona como un encanto:
myNumberPicker.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);
También puedes configurar esto en XML:
android:descendantFocusability="blocksDescendants"
Acabo de mejorar los ans de @MaxVogler (por lo tanto, si quieres votar este voto @MaxVogler también) y hacerlo un hack robusto. Además, no necesitamos llamar a setOnFocusChangeListener
y setInputType
. Solo setFocusable
a falso servirá.
A continuación hay una aplicación auxiliar para habilitar / deshabilitar la función
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;
}
}
}
Aquí hay otra forma de hacerlo que le permite al usuario editar un número si lo desea, simplemente suprime el teclado virtual al principio. Use NumberPicker.setDescendantFocusability(FOCUS_BLOCK_DESCENDANTS)
para suprimir el teclado NumberPicker.setDescendantFocusability(FOCUS_BLOCK_DESCENDANTS)
cuando la interfaz aparece por primera vez según las respuestas anteriores. A continuación, obtenga su diálogo o actividad para implementar View.OnTouchListener
, llame a setOnTouchListener(this)
en su NumberPicker
, y en su implementación de onTouch(View v,MotionEvent e)
restablezca la capacidad de enfoque del descendiente del selector numérico a su valor normal, luego devuelva false.
Devolver el valor falso significa que el número aún procesa el toque mediante NumberPicker, lo que significa que si el usuario toca el cuadro de edición, aparecerá el teclado virtual. Esto pasa a ser exactamente lo que quería enfrentar el mismo problema: hacer que el teclado suave aparezca con el cuadro de diálogo cuando muestra por primera vez no es agradable ya que cambia el cuadro de diálogo después de que aparece.
public class GetBufferDialog extends DialogFragment implements View.OnTouchListener {
después de crear el diálogo en el método onCreateDialog()
y encontrar el 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;
}
Después de leer el código fuente de com / android / internal / widget / NumberPicker.java, 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);
Lo más simple que encontré para trabajar fue:
numberPicker = (NumberPicker) myDialogView.findViewById(R.id.myViewId);
EditText numberPickerChild = (EditText) numberPicker.getChildAt(0);
numberPickerChild.setFocusable(false);
numberPickerChild.setInputType(InputType.TYPE_NULL);
No sé por qué funciona, pero al configurar OnClickListener que no impide que el teclado se muestre (Lollipop)
numberPicker.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
}
});
Versión Xml de la respuesta de Andrew Webber
android:descendantFocusability="blocksDescendants"
Ejemplo
<NumberPicker
android:id="@+id/your_numberpicker"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:descendantFocusability="blocksDescendants"/>
/**
* 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();
}
}
}
* llamando esto:
no bloqueará la capacidad de enfoque de los descendientes (el número se podrá editar)
ocultará entrada suave en crear
antes (entrada de procesamiento) getValue () permitirá obtener walue adecuado