2012-08-12 7 views

risposta

6

penso che si può fare questo:

  • inizializzare un displayed array values per la raccoglitrice:

    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", .....}; */ 
    
  • Impostare la matrice mostrata al selettore:

    /* 
    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); 
    
  • Quando vuoi ottenere/impostare il valore del selettore:

    //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); 
    

Infine, v'è un grande widget di facile da personalizzare chiamato android-wheel. Puoi verificarlo e usarlo se vuoi.

+0

Grazie per la risposta e la soluzione suggerita. Tuttavia, non vorrei limitare l'utente a inserire alcun valore preciso nel selettore.Ad esempio, se si desidera inserire il valore 47 o 48, si dovrebbe essere liberi di farlo. Questo è anche il comportamento predefinito del selettore di numeri se si tocca due volte il selettore. –

+0

Quindi la tua domanda non riguarda l'aumento/decremento dell'intervallo di NumberPicker ?! – iTurki

+0

Sicuro che lo sia. Quello che voglio è preimpostare l'intervallo di aumento/diminuzione durante lo scorrimento o l'utilizzo delle frecce su/giù di NumberPicker. Ma se tu come utente vuoi inserire un valore più preciso, tra questi intervalli dovresti essere autorizzato a farlo, come comportamento predefinito di NumberPicker. Non ho ancora testato la tua soluzione, quindi potrebbe essere che funzioni come descritto qui. –

0

L'ultimo punto di @ iturki che imposta un valore. Perché valueInNumberPicker X PICKER_RANGE = valueInDisplayedValueArray Così possiamo evitare il ciclo for per:

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

I miei 2 centesimi.

A proposito, ottima risposta di iturki.

0

Ho usato il onScrollListener per lo scorrimento con differenti dimensioni di fase e la onValueChanged per la movimentazione ingresso diretto con la tastiera numerica. Per l'uso è necessaria la variabile oldValue che è disponibile in entrambi gli ascoltatori.

int oldValue = 0; 

Nel onScrollListener ho usato lo STATE_IDLE solo perché funziona e I don t capire al 100% la differenza per questo uso tra tutti e tre ... pensate di loro è possibile utilizzare per questo scopo.

È necessario che la variabile oldValue globale conosca il valore precedente prima di scorrere. Non ho trovato un'altra soluzione. Le clausole if sono il boarder min (0) e max (1000).

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

Questi tre chiamate aggiornare miei elementi (Vitesse è un ProgressBar accoppiato, speedPicker è il numberPicker).

In onValueChange aggiorno anche gli elementi e ho impostato il valore oldValue.

proposito stepSize qui è 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); 

     } 
    }); 

Questo codice funziona dopo alcuni test uscire bene per me.

Questa risposta è stata ispirata da jpintado. Vedere la sua risposta in Android NumberPicker OnValueChangeListener

+0

Ma devo aggiungere qualcosa all'inizio, il primo a dire che 4-5 in/diminuisce di 1 sono riconosciuti da onValueChange! E dopo che il valore cambia di 100. – KelvinGradCelsius