Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Cambiar el tamaño de paso de un NumberPicker

¿Es posible hacerlo de una manera más conveniente que manejarlo en el evento OnScrollListener? Lástima que no tiene un atributo de tamaño de paso …

  • Puede subrayar palabras en texto TextView
  • Widget StackView Ejemplo de código fuente
  • Tamaño de Android Widget
  • ¿Acceso estático a los recursos de una aplicación para Android?
  • Restablecimiento del valor del widget de búsqueda (SearchView)
  • Problema de enfoque de Android WebView
  • AppWidgetHost no actualiza widgets
  • Crear barra de búsqueda persistente en android
  • 5 Solutions collect form web for “Cambiar el tamaño de paso de un NumberPicker”

    ¿Por qué no añadir un OnValueChangeListener Algo así como:

    numberPicker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() { @Override public void onValueChange(NumberPicker picker, int oldVal, int newVal) { picker.setValue((newVal < oldVal)?oldVal-5:oldVal+5); } }); 

    El NumberPicker en Android tiene un método llamado setDisplayedValues . Puede utilizar este para mostrar valores personalizados (se necesita una matriz de cadenas) y, a continuación, asignarlos cuando se necesita el valor. Así que si necesita pasos de 5 en un selector de minutos, por ejemplo, puede crear una matriz como esta:

     String[] minuteValues = new String[12]; for (int i = 0; i < minuteValues.length; i++) { String number = Integer.toString(i*5); minuteValues[i] = number.length() < 2 ? "0" + number : number; } minutePicker.setDisplayedValues(minuteValues); 

    Y luego, cuando obtiene el valor en OnValueChangeListener , sólo tiene que devolverlo a un entero:

     Integer.parseInt(minuteValues[newVal]); 

    Para establecer un recuento de pasos de '5' por ejemplo, utilice NumberPicker.Formatter :

      NumberPicker.Formatter formatter = new NumberPicker.Formatter() { @Override public String format(int value) { int temp = value * 5; return "" + temp; } }; numberPicker.setFormatter(formatter); 

    El NumberPicker en Android tiene un método llamado setDisplayedValues . Puede utilizar este para mostrar valores personalizados (se necesita una matriz de cadenas) y, a continuación, asignarlos cuando se necesita el valor.

    Por ejemplo, puede crear una función como esta:

     public String[] getArrayWithSteps (int iMinValue, int iMaxValue int iStep) { int iStepsArray = (iMaxValue-iMinValue)/iStep+1; //get the lenght array that will return String[] arrayValues= new String[iStepsArray]; //Create array with length of iStepsArray for(int i = 0; i < iStepsArray; i++) { arrayValues[i] = String.valueOf(iMinValue + (i*iStep)); } return arrayValues; } 

    Por lo tanto, debe llamar al método> NumberPicker.setDisplayedValues , por ejemplo:

     int min = 5; int max = 180; int step = 10; String[] myValues = getArrayWithSteps(min, max, step); //get the values with steps... Normally //Setting the NumberPick (myNumberPick) myNumberPick.setMinValue(0); myNumberPick.setMaxValue((max-step)/min+1); //Like iStepsArray in the function //Because the Min and Max Value should be the range that will show. //For example, Min = 0 and Max = 2, so the NumberPick will display the first three strings in the array String (myValues); myNumberPick.setDisplayedValues(myValues);//put on NumberPicker 

    Para obtener el valor en el NumberPick:

     String sValue = String.valueOf(10+(myNumberPick.getValue()*5)); //->> (iMinValue + (myNumberPick.getValue()*iStep)) 

    Perdon por mi inglés…

    Cuando se utilizan los métodos descritos anteriormente, hay que tener en cuenta que el selector permite al usuario no sólo seleccionar un valor desplazándose, sino también ingresándolo con el teclado.

    De forma predeterminada, el tipo de entrada del campo de entrada se establece en TYPE_CLASS_NUMBER y, por lo tanto, el usuario se presenta con teclado numérico. Parece que cuando se utiliza setDisplayedValues el selector cambia el tipo a TYPE_CLASS_TEXT , sin embargo, cuando se utiliza setFormatter el tipo de entrada no se cambia.

    Por lo tanto, utilizar el formateador en este caso puede dar lugar a un comportamiento inesperado. Digamos que desea que el usuario pueda seleccionar sólo los valores "0" o "5". Puede tener código como este:

     NumberPicker numberPicker = (NumberPicker) findViewById(R.id.my_number_picker); numberPicker.setMinValue(0); numberPicker.setMaxValue(1); numberPicker.setFormatter(v -> v == 0 ? "0" : "5"); 

    Sin embargo, en este escenario el usuario se presenta con el teclado numérico, pero sólo puede introducir sólo "0" o "1".

    Si utiliza en su lugar:

     numberPicker.setDisplayedValues(new String[] { "0", "5" }); 

    El usuario verá el teclado de texto, pero podrá introducir "0" o "5" como se esperaba.

    Si te molesta con el teclado de texto puedes usar la reflexión para acceder al campo privado y establecer el tipo de entrada de nuevo a número (que por supuesto no se recomienda a menos que sea realmente necesario). El campo se llama "mInputText", o "mText" si apuntas a oldies goldies como Gingerbread.

      try { Field inputField = NumberPicker.class.getDeclaredField("mInputText"); inputField.setAccessible(true); EditText inputText = (EditText) inputField.get(numberPicker); inputText.setRawInputType(InputType.TYPE_CLASS_NUMBER); } catch (ClassCastException e) { // Just ignore this exception and do nothing. } catch (IllegalAccessException e) { // Just ignore this exception and do nothing. } catch (NoSuchFieldException e) { // Just ignore this exception and do nothing. } 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.