EditText Valores en rango

Me gustaría introducir los valores en un rango como 1-60. El EditText no debe aceptar valores como 61,62 …, o 0, -1, -2 …

¿Cómo podemos dar el rango 1-60 a EditText en android? He hecho en main.xml como

  <EditText android:layout_height="wrap_content" android:id="@+id/editText1" android:layout_width="160dip" android:inputType="number"> </EditText> 

Puede asignar un TextWatcher a su EditText y escuchar los cambios de texto allí, por ejemplo:

 public void afterTextChanged(Editable s) { try { int val = Integer.parseInt(s.toString()); if(val > 60) { s.replace(0, s.length(), "60", 0, 2); } else if(val < 1) { s.replace(0, s.length(), "1", 0, 1); } } catch (NumberFormatException ex) { // Do something } } 

Como se menciona por Devunwired, observe que las llamadas a s.replace() llamará a TextWatcher de nuevo recursivamente.

Es típico de envolver estos cambios con una comprobación en un boolean "edición" bandera por lo que las llamadas recursivas saltar y simplemente volver, mientras que los cambios que vienen de dentro.

He encontrado una solución ordenada aquí :

 public class InputFilterMinMax implements InputFilter { private int min, max; public InputFilterMinMax(int min, int max) { this.min = min; this.max = max; } public InputFilterMinMax(String min, String max) { this.min = Integer.parseInt(min); this.max = Integer.parseInt(max); } @Override public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { try { int input = Integer.parseInt(dest.toString() + source.toString()); if (isInRange(min, max, input)) return null; } catch (NumberFormatException nfe) { } return ""; } private boolean isInRange(int a, int b, int c) { return b > a ? c >= a && c <= b : c >= b && c <= a; } } 

Y simplemente aplique este filtro a un texto de edición así:

 mCentsEditText = (EditText)v.findViewById(R.id.cents_edit_text); InputFilterMinMax filter = new InputFilterMinMax("0", "99") {}; mCentsEditText.setFilters(new InputFilter[]{filter}); 

¿Por qué no usar un Seekbar en lugar de EditText? De esta forma, sólo se pueden introducir números y se puede especificar / modificar el límite máximo cuando sea necesario.

 public class SeekBar1 extends Activity implements SeekBar.OnSeekBarChangeListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); .. mSeekBar = (SeekBar)findViewById(R.id.seekBar); mSeekBar.setOnSeekBarChangeListener(this); .. } public void onProgressChanged(SeekBar seekBar, int progress, boolean fromTouch) { //Do your Changes Here } public void onStartTrackingTouch(SeekBar seekBar) { //On First Track Touch } public void onStopTrackingTouch(SeekBar seekBar) { //On Stop Track Touch } } 

Para valores numéricos de tipo de entrada, Seekbar es la mejor interfaz de usuario posible. Aunque, la precisión en él es cuestionable.

Prueba esto..

  EditText.setOnEditorActionListener(new OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { //add your condtion here. return false; } }); 

Pregunta muy interesante.

Supongo que la mejor manera de hacer esto es implementar un nuevo inputType , pero el método setInputType recibe un int. Nada que hacer ahi 🙁

En ese método doc dice:

Establezca el tipo de contenido con una constante como se define para inputType. Esto se encargará de cambiar el oyente clave, llamando a setKeyListener (KeyListener), para que coincida con el tipo de contenido dado.

Excelente, puede proporcionar un keyListener con setKeyListener .

Puede extender android.text.method.DigitsKeyListener para crear su nuevo keyListener , evitando el problema con TextWatcher .

No tengo suficientes privilegios para comentar sobre la respuesta de Ashok Felix, pero me gustaría añadir que he encontrado algún código para ver un SeekBar en las preferencias.

Es muy fácil de usar (no soy el autor). Vea el código de SeekBarPreference por Matthew Wiggins: http://android.hlidskialf.com/blog/code/android-seekbar-preference

Esto funciona, pero no vive.

 editText.setOnFocusChangeListener(new OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { try { int val = Integer.parseInt(editText.getText() .toString()); if (val > 2000) { editText.setText(""); } else if (val < 100) { editText.setText(""); } } catch (NumberFormatException ex) { } } }); 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.