Cómo crear una preferencia que acepte sólo valores enteros

¿Existe una manera de crear una preferencia en un PreferenceFragment que acepta sólo valores enteros? Podría implementar un EditTextPreference y registrar un OnPreferenceChangeListener en el que podría rechazar el cambio si el usuario introduce una cadena que no es un número, pero yo preferiría algo que está destinado a la celebración de sólo los números y que no permite a los usuarios introducir nada más , Tal vez mostrando sólo un teclado de teclado de marcación .. No existe tal preferencia, ya que cada descendiente de Preferencia se asigna a un Boolean ( CheckBoxPreference ), a String (* EditTextPreference) oa String array ( MultiSelectListPreference ), es decir, hay No hay preferencias asignadas a enteros, pero tal vez algunos de ustedes pueden darme una pista o al menos decirme si hay mejores soluciones que la que he propuesto anteriormente.

Solución propuesta por Gray:

EditText editText = ((EditTextPreference) findPreference("intent_property")).getEditText(); editText.setKeyListener(new NumberKeyListener() { @Override public int getInputType() { // The following shows the standard keyboard but switches to the view // with numbers on available on the top line of chars return InputType.TYPE_CLASS_NUMBER; // Return the following to show a dialpad as the one shown when entering phone // numbers. // return InputType.TYPE_CLASS_PHONE } @Override protected char[] getAcceptedChars() { return new String("1234567890").toCharArray(); } }); 

Solución más corta, que no permite variar el teclado al teclado de marcación, pero requiere menos código:

 EditText editText = ((EditTextPreference) findPreference("intent_property")).getEditText(); editText.setKeyListener(new DigitsKeyListener()); 

No me gusta solo una cosa acerca de esta solución: el usuario puede ingresar 0000 y es aceptado y guardado en la preferencia compartida (que es una cadena) como "0000". Esto requiere que implemente un OnSharedPreferenceChangeListener para interceptar los cambios a Compartir preferencias y eliminar los ceros a la izquierda en esta preferencia o implementar un oyente de cambio directamente en esta preferencia y devolver falsa a rechazar los números con ceros finales ( dime si hay una mejor solución a este último problema que no implica la implementación de su propia preferencia ). Sería hermoso si pudiéramos modificar el newValue en OnPreferenceChangeListener ..

Después de leer las soluciones propuestas, todavía creo que una costumbre preferencia es el camino a seguir. Leí su comentario en texto en negrita, pero la creación de un EditTextIntegerPreference básico es realmente súper simple y resolverá el problema restante que tiene cuando el usuario introduce por ejemplo "0000".

Sólo una nota al principio: ya que normalmente quieres poder usar las preferencias en varios lugares de tu aplicación, por lo que a mí respecta, una correcta implementación de un EditTextIntegerPreference almacenaría su valor en un Integer . De esta forma podrá recuperar el valor int en cualquier lugar, sin necesidad de analizarlo o emitirlo primero.

Sin embargo, para mantener esta respuesta al punto y compacto, en realidad voy a mostrar una extensión de un regular EditTextPreference , lo que significa que bajo el capó, el valor seguirá siendo almacenado como una cadena. Si usted está realmente interesado en conseguir la "correcta" aplicación para trabajar, no me importa escribir eso hasta más tarde. No debe ser demasiado complicado, sin embargo, por lo que es posible que desee tener una grieta en él mismo primero. 🙂

 public class EditTextIntegerPreference extends EditTextPreference { private Integer mInteger; public EditTextIntegerPreference(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); getEditText().setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_SIGNED); } public EditTextIntegerPreference(Context context, AttributeSet attrs) { super(context, attrs); getEditText().setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_SIGNED); } public EditTextIntegerPreference(Context context) { super(context); getEditText().setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_SIGNED); } @Override public void setText(String text) { final boolean wasBlocking = shouldDisableDependents(); mInteger = parseInteger(text); persistString(mInteger != null ? mInteger.toString() : null); final boolean isBlocking = shouldDisableDependents(); if (isBlocking != wasBlocking) notifyDependencyChange(isBlocking); } @Override public String getText() { return mInteger != null ? mInteger.toString() : null; } private static Integer parseInteger(String text) { try { return Integer.parseInt(text); } catch (NumberFormatException e) { return null; } } } 

La razón por la que esto resuelve el problema "0000", es que simplemente estamos lanzando el valor digitado del usuario a un int antes de almacenarlo, y lo conectamos de nuevo a una cadena al recuperarla. Eso significa que cualquier cero a la izquierda (excepto para '0' como un número de curso) desaparecerá automágicamente.

El tipo de entrada 'número' restringirá al usuario a ingresar sólo ingrese números, por lo que el método parseInteger(...) está presente principalmente por razones de cordura, aunque detectará una NumberFormatException si intenta ingresar una cadena vacía o null . Una vez más, usted puede hacer esto más bonito, que no he hecho por ahora.

Hay una manera más fácil de hacer esto. Simplemente establezca en el EditTextPreference en su XML a android: numeric = "entero" (puede establecerlo en entero, firmado o decimal).

Eclipse (o cualquier herramienta en la que esté trabajando) no le mostrará esto como un posible atributo, sino que simplemente escríbalo en su EditTextPreference y limpie su proyecto. Verá que no le dará ningún error. 🙂

Supongo que u puede llamar a getEditText () para obtener un obj de EditText, a continuación, llamar a setKeyListener con un NumberKeyListener.

Debe utilizar PreferenceActivity que se utiliza básicamente para mostrar preferencias como un archivo xml. En esta actividad puede usar casillas de verificación, editar texto y guardar valores en las preferencias.

También puede volver a abrir el cuadro de diálogo cuando reciba una excepción después de intentar parseInt () el número. Aquí hay un ejemplo de código:

 public class MyEditTextPreference extends EditTextPreference { private EditText _editText; public MyEditTextPreference(Context context, AttributeSet attrs) { super(context, attrs); _editText = getEditText(); } @Override public void onDismiss(DialogInterface dialog) { super.onDismiss(dialog); try { Integer.parseInt(_editText.getText().toString()); } catch (NumberFormatException e) { ((Dialog) dialog).show(); } } } 
  • Después de cambiar una preferencia (una configuración), el texto que muestra la configuración no se actualiza
  • Preferencia setIcon a ColorDrawable no funciona en Android 5.0 Lollipop
  • Uso de findviewbyid en preferenciaactividad
  • Cuándo usar CheckBox y cuando cambie
  • Compruebe si un inicio de sesión y una contraseña ya se encuentran en Preferencias
  • NullPointerException al llamar a RingTonePreference en Samsung Galaxy S
  • Cómo llenar ListPreference dinámicamente cuando onPreferenceClick se dispara?
  • TimePicker en PreferenceScreen
  • ¿Cómo regresar de la pantalla de preferencias a la actividad principal?
  • Android: Cómo obtener el tiempo de un TimePicker cuando se escribe en
  • PreferenceFragment - Diferencia entre getPreferenceManager () y getPreferenceScreen ()?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.