2012-08-12 11 views

Respuesta

6

Creo que se puede hacer esto:

  • Inicializar un displayed array values para su selector:

    int NUMBER_OF_VALUES = 10; //num of values in the picker 
    int PICKER_RANGE = 50; 
    ... 
    String[] displayedValues = new String[NUMBER_OF_VALUES]; 
    //Populate the array 
    for(int i=0; i<NUMBER_OF_VALUES; i++) 
        displayedValues[i] = String.valueOf(PICKER_RANGE * (i+1)); 
    /* OR: if the array is easy to be hard-coded, then just hard-code it: 
        String[] displayedValues = {"50", "100", "150", .....}; */ 
    
  • Establecer la matriz que se muestra a su selector:

    /* 
    NOTE: Your picker range has to be [0, displayedValues.size()-1] to be 
         consistent with the array index (displayedValues index). 
    */ 
    //ToDo: Initialize the picker first. 
    numPicker.setMinValue(0); 
    numPicker.setMaxValue(displayedValues.size()-1); 
    numPicker.setDisplayedValues(displayedValues); 
    
  • Cuando desea obtener/establecer el valor del selector:

    //To get the current value in the picker 
    choosenValue = displayedValues[numPicker.getValue()]; 
    //To set a new value (let's say 150) 
    for(int i=0; i<displayedValues.length ; i++) 
        if(displayedValues[i].equals("150")) 
         numPicker.setValue(i); 
    

Por último, hay una gran widget de fácil de personalizar llamada android-wheel. Puede verificarlo y usarlo si lo desea.

+0

Gracias por su respuesta y la solución sugerida. Sin embargo, no me gustaría restringir al usuario de poner ningún valor exacto en el selector.Por ejemplo, si desea poner el valor 47 o 48, debería tener libertad para hacerlo. Este es también el comportamiento predeterminado del selector de número si toca dos veces el selector. –

+0

Por lo tanto, su pregunta no es acerca de 'aumentar/disminuir el intervalo de NumberPicker' ?! – iTurki

+0

Claro que sí. Lo que quiero es preestablecer el intervalo de aumento/disminución al desplazarme o usar las flechas arriba/abajo de NumberPicker. Pero si usted como usuario desea poner un valor más preciso, entre esos intervalos se le debe permitir hacerlo, como el comportamiento predeterminado de NumberPicker. Todavía no he probado su solución, por lo que podría ser que funcione como se describe aquí. –

0

El último punto de @ iturki establece un valor. Debido valueInNumberPicker X = PICKER_RANGE valueInDisplayedValueArray Así podemos evitar el bucle por:

// PICKER_RANGE= 50 so 150/50 -1 = 2, numPicker.setValue(2) == 150 
numPicker.setValue(150/PICKER_RANGE -1); 

Mis 2 centavos.

Por cierto, gran respuesta por iturki.

0

he utilizado el onScrollListener para el desplazamiento con diferentes tamaños de paso y la onValueChanged para el manejo de la entrada directa con el teclado numérico. Para el uso necesita la variable oldValue que está disponible en ambos oyentes.

int oldValue = 0; 

En el onScrollListener he utilizado la STATE_IDLE sólo porque funciona y yo no entiendo 100% de la diferencia para este uso entre los tres ... creo que se puede utilizar ya sea para este propósito.

Necesita la variable global oldValue para conocer el valor anterior antes de desplazarse. No he encontrado otra solución. Las cláusulas if son las fronteras mín (0) y máx (1000).

speedPicker.setValue(oldValue); 
vitess.setProgress(oldValue); 
((MainActivity) getActivity()).setSpeed(oldValue); 

Estos tres llamadas actualizar mis elementos (Vitess es un progressBar acoplada, speedPicker es la numberPicker).

En onValueChange actualizo también los elementos y configuro oldValue.

Por cierto tamaño de paso aquí es 100.

speedPicker.setOnScrollListener(new OnScrollListener() { 
     public void onScrollStateChange(NumberPicker speedPicker, int scrollState) { 

      if (scrollState == NumberPicker.OnScrollListener.SCROLL_STATE_IDLE) { 
       if (speedPicker.getValue() < oldValue){ 
        if (speedPicker.getValue() >= 100) 
         oldValue-=100; 
        else 
         oldValue = 0; 

       } 
       else{ 
        if (speedPicker.getValue() <= 900) 
         oldValue+=100; 
        else 
         oldValue = 1000; 
       } 

       speedPicker.setValue(oldValue); 
       vitess.setProgress(oldValue); 
       ((MainActivity) getActivity()).setSpeed(oldValue); 

      } 
      else if (scrollState == NumberPicker.OnScrollListener.SCROLL_STATE_FLING) { 
      } 
      else if (scrollState == NumberPicker.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) { 
      } 
     } 
    }); 

    speedPicker.setOnValueChangedListener(new OnValueChangeListener() { 
     public void onValueChange(NumberPicker speedPicker, int oldVal, int newVal) { 

      oldValue = oldVal; 
      speedPicker.setValue(newVal); 
      vitess.setProgress(newVal); 
      ((MainActivity) getActivity()).setSpeed(newVal); 

     } 
    }); 

Este código funciona después de algunas pruebas dejar de fumar es bueno para mí.

Esta respuesta fue inspirada en jpintado. Vea su respuesta en Android NumberPicker OnValueChangeListener

+0

Pero tengo que añadir algo al principio, los primeros digamos 4-5 in/decrece en 1 son reconocidos por el onValueChange! Y después de eso, el valor cambia por 100. – KelvinGradCelsius

Cuestiones relacionadas