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()
.
- Cómo restringir el EditText para aceptar sólo caracteres alfanuméricos
- ¿Cómo puedo manejar ImeOptions?
- TextInputLayout: RuntimeException - No se pudo resolver el atributo en el índice 24
- Editar selección de texto Anclajes ausentes
- Android edittext - selecciona el número de teléfono del contacto (con autocompletado)
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?
- EditText ir automáticamente a una nueva línea
- Volver evento clave en EditText
- Cómo configurar el enfoque a la derecha del texto en EditText para android?
- ¿Cómo comprobar símbolos en EditText en android?
- Vista de texto editable al hacer clic
- Cómo cambiar el enfoque a la siguiente edición de texto en android?
- No se puede deshabilitar el texto predictivo
- Cómo cambiar el texto de TextView en el cambio de texto de EditText?
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:
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.