Cómo limitar EditTextPreference a un rango 1024: 65535

Tengo una EditTextPreference definida como:

<EditTextPreference android:defaultValue="8888" android:key="someKey" android:title="SomeString" android:inputType="number" > 

EditTextPreference utiliza un EditText internamente que se puede obtener con EditTextPreference.getEditText() .

Quisiera limitar el número que el usuario puede ingresar a un rango de números enteros entre 1024 y 65535. ¿Cómo puedo hacer eso?

Intenté utilizar un InputFilter y un TextWatcher sin éxito.

¿Algunas ideas?

Como usted pudo haber adivinado que estoy tratando de validar la introducción de un puerto de red. Tal vez debería usar algún otro tipo de entrada para esto?

Puede hacer esto usando un EditText, pero sería mucho más fácil usar un NumberPicker .

Tiene métodos predefinidos para lo que quieres: setMinValue (int) , setMaxValue (int) .

Por inspiración:

 import android.content.Context; import android.preference.DialogPreference; import android.util.AttributeSet; import android.util.Log; import android.view.View; import android.widget.NumberPicker; /* * Add this to your XML resource. */ public class NumberPickerPreference extends DialogPreference { private NumberPicker numberPicker; public NumberPickerPreference(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected View onCreateDialogView() { return generateNumberPicker(); } public NumberPicker generateNumberPicker() { numberPicker = new NumberPicker(getContext()); numberPicker.setMinValue(1025); numberPicker.setMaxValue(65535); numberPicker.setValue(1025); /* * Anything else you want to add to this. */ return numberPicker; } @Override protected void onDialogClosed(boolean positiveResult) { super.onDialogClosed(positiveResult); if (positiveResult) { int port = numberPicker.getValue(); Log.d("NumberPickerPreference", "NumberPickerValue : " + port); } } } 

Estoy respondiendo a esto mismo porque no había otras respuestas que yo quería.

 final int minPort = 1024; final int maxPort = 2048; final EditTextPreference editTextPreference = (EditTextPreference)findPreferenceByResId(R.string.pref_telnet_server_port_key); editTextPreference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { int val = Integer.parseInt(newValue.toString()); if ((val > minPort) && (val < maxPort)) { Log.d(LOGTAG, "Value saved: " + val); return true; } else { // invalid you can show invalid message Toast.makeText(getApplicationContext(), "error text", Toast.LENGTH_LONG).show(); return false; } } }); 

De esta forma se muestra un brindis cuando el usuario introduce un número no válido y no guarda el valor introducido. Esto funciona para mí y es más sencillo que la preferencia personalizada NumberPicker que no pude hacer el trabajo.

Usted podría utilizar mi NumberPickerPreference.java de encargo:

 public class NumberPickerPreference extends DialogPreference { private NumberPicker mPicker; private int mNumber = 1024; public NumberPickerPreference(Context context, AttributeSet attrs) { this(context, attrs, 0); } public NumberPickerPreference(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); setPositiveButtonText(android.R.string.ok); setNegativeButtonText(android.R.string.cancel); } @Override protected View onCreateDialogView() { mPicker = new NumberPicker(getContext()); mPicker.setMinValue(1024); mPicker.setMaxValue(2048); mPicker.setValue(mNumber); return mPicker; } @Override protected void onDialogClosed(boolean positiveResult) { if (positiveResult) { mPicker.clearFocus(); setValue(mPicker.getValue()); } } @Override protected void onSetInitialValue(boolean restoreValue, Object defaultValue) { setValue(restoreValue ? getPersistedInt(mNumber) : (Integer) defaultValue); } public void setValue(int value) { if (shouldPersist()) { persistInt(value); } if (value != mNumber) { mNumber = value; notifyChanged(); } } @Override protected Object onGetDefaultValue(TypedArray a, int index) { return a.getInt(index, 0); } } 

Aquí hay un ejemplo completo de aplicación que lo utiliza:

captura de pantalla

El número de puerto se guardará como un entero.

La respuesta completa está aquí.

 public boolean onPreferenceChange(Preference preference, Object value) { . . . //other default items . . . EditTextPreference editTextPreference=(EditTextPreference) findPreference("someKey"); editTextPreference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { int val = Integer.parseInt(newValue.toString()); if ((val > 1024) && (val < 65355)) { Log.d("Preference ","Value saved: " + val); preference.setSummary(""+val); return true; } else { // invalid you can show invalid message Toast.makeText(getActivity(), "Choose something between 3 and 25", Toast.LENGTH_LONG).show(); return false; } } }); } 

En su configuración, busque el método onPrerenceChange e inserte el bloque de código que he dado anteriormente. Esto funciona para mi.

  • Centrarse en segundo edittext sólo si primero es no-vacío android
  • Android EditText android: textDirection
  • Permitir sólo charcters seleccionados basados ​​en regex en un EditText
  • Android: valor predeterminado en editText
  • ¿Cómo utilizo AsYouTypeFormatter TextWatcher en la aplicación de Android?
  • Desarrollo de Android: ¿Cómo puedo hacer un texto de edición sencilla por lo que es sólo un cuadrado blanco?
  • Cómo seleccionar siguiente y anterior Editar textos en una vista
  • ¿Hay una manera de permitir que el usuario seleccione el texto de muchos `EditText`s en una fila (que están en ListView)?
  • Qué atributo de tema cambia el color de texto de un mensaje de error de EditText
  • No hay cursor en editText en Honeycomb
  • Cómo rellenar automáticamente el correo electrónico edittext con el ID de correo electrónico con el que está registrado el dispositivo
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.