2012-10-19 14 views

Odpowiedz

7

Dlaczego nie po prostu dodać OnValueChangeListener coś takiego:

numberPicker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() { 

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

}); 
+0

OK, ale to tak samo jak przy użyciu onScrollListener. Czy używanie zdarzeń jest jedynym sposobem na osiągnięcie tego efektu? – user940016

+0

Tak, przypuszczam, że można rozszerzyć klasę o wielkość kroku, a następnie przesłonić metodę onClick. To prawdopodobnie więcej kodu niż użycie tylko słuchacza. – ajpolt

+0

Metoda detektora powinna mieć wartość onValueChange zamiast onChange, a ustawnik powinien być teraz ustawionyOnValueChangedListener. – Loolooii

25

NumberPicker w Androidzie ma metodę zwaną setDisplayedValues. Możesz użyć tego do pokazania wartości niestandardowych (potrzeba tablicy Ciągów), a następnie zmapować je, gdy potrzebujesz tej wartości. Więc jeśli potrzebujesz etapy 5 w minut próbnika, na przykład, można utworzyć tablicę tak:

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

a następnie, gdy pojawi się wartość w OnValueChangeListener, wystarczy oddać go z powrotem do liczbą całkowitą:

Integer.parseInt(minuteValues[newVal]); 
5

NumberPicker Android ma metodę zwaną setDisplayedValues. Możesz użyć tej do pokazywania wartości niestandardowych (wymaga ona tablicy Ciągów), a następnie mapować je, gdy potrzebujesz tej wartości.

Na przykład, można utworzyć funkcję tak:

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; 
} 

Tak, należy wywołać metodę>NumberPicker.setDisplayedValues, na przykład:

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 

Aby uzyskać wartość w Numer:

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

Przepraszamy, ale mój produkt ki ...

+0

myNumberPick.setMaxValue ((max-step)/min + 1); // Podobnie jak iStepsArray w funkcji Lepiej, jeśli jest to: (max-min)/step. - Min. Może wynosić 0, a dzielić 0, jest błędne. - bez +1, ponieważ dodasz 1 wartość więcej – Sigvent

8

Aby ustawić liczbę kroków z „5” na przykład użyć NumberPicker.Formatter:

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

w rzeczywistości, to rozwiązanie jest proste, ale trudne w tym samym czasie, mogę preferować w ten sposób – khalifavi

+0

Nie zapomnij, aby ustawić numberPicker.setMaxValue na coś rozsądnego. Jeśli go nie ustawisz, selektor wyświetli tylko 0. Na przykład w 5-minutowych odstępach, na przykład, musisz ustawić wartość 11, ponieważ selektor zachowa 11 liczb (0 - 55). – ckn

+0

Dobrym pomysłem może być ustawienie parametru numberPicker.setDescendantFocusability (ViewGroup.FOCUS_BLOCK_DESCENDANTS); W przeciwnym razie pole liczbowe w selektorze będzie mogło skupić się na danych wejściowych. – ckn

0

Przy zastosowaniu metod opisanych powyżej, trzeba mieć świadomość, że zbieracz pozwala użytkownikowi nie tylko wybierz wartość przewijając, ale także wprowadzając ją za pomocą klawiatury.

Domyślnie typ wejściowy pola wejściowego jest ustawiony na TYPE_CLASS_NUMBER, a zatem użytkownikowi przedstawiono klawiaturę numeryczną. Wygląda na to, że przy korzystaniu z setDisplayedValues selektor zmienia typ na TYPE_CLASS_TEXT, jednak przy korzystaniu z setFormatter typ wejścia nie jest zmieniany.

Dlatego używanie formatera w tym przypadku może prowadzić do nieoczekiwanego zachowania. Załóżmy, że chcesz, aby użytkownik mógł wybrać tylko wartości "0" lub "5". Może masz kodu:

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

Jednak w tym scenariuszu użytkownik jest przedstawiony za pomocą klawiatury numerycznej, ale jest tylko w stanie wejść tylko „0” lub „1”.

Jeśli używasz zamiast:

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

użytkownik zobaczy klawiaturę tekstową, ale będzie mógł wpisać „0” lub „5”, jak oczekiwano.

Jeśli masz problem z klawiaturą tekstową, możesz użyć odbicia, aby uzyskać dostęp do pola prywatnego i ustawić typ wejścia z powrotem na numer (co oczywiście nie jest zalecane, chyba że jest to naprawdę konieczne). Pole nazywa się "mInputText" lub "mText", jeśli celujesz w oldies goldies jak 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. 
    } 
Powiązane problemy