Czy można to zrobić w bardziej wygodny sposób niż w przypadku obsługi zdarzenia OnScrollListener? Szkoda, że nie posiada atrybut wielkość kroku ...Zmiana wielkości kroku obiektu NumberPicker
Odpowiedz
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);
}
});
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]);
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 ...
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
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);
w rzeczywistości, to rozwiązanie jest proste, ale trudne w tym samym czasie, mogę preferować w ten sposób – khalifavi
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
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
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.
}
- 1. Zmiana wielkości łańcucha w Eclipse
- 2. Zmiana wartości kroku w oknie wyszukiwania?
- 3. Zmiana kroku przyrostowego o auto_inrement o
- 4. Typ wejścia HTML5 = zmiana kroku zmiany numeru
- 5. Zmiana wielkości liter w nazwach kolumn
- 6. Zmiana wielkości pliku w systemie Windows?
- 7. .NET Zmiana wielkości obrazu wycieku pamięci
- 8. Zmiana wielkości klawiatury w szybkim tempie?
- 9. Zmiana wielkości bufora w trybie wieloprocesowym.Queue
- 10. Ustawianie typeFace na NumberPicker
- 11. Android: NumberPicker nie działa
- 12. Dynamiczna zmiana nadklasy obiektu
- 13. Jak zwiększyć rozmiar czcionki NumberPicker Android 6.0?
- 14. Jak zmniejszyć wyściółkę w NumberPicker
- 15. Zmiana klasy obiektu w ActiveRecord
- 16. Zmiana obiektu rootViewController w UIWindow
- 17. Zmiana bieżącego katalogu obiektu FileSystemObject
- 18. Zmiana typu obiektu w JavaScript
- 19. Zmiana wielkości wykresu podczas drukowania wielu wykresów w R
- 20. WPF - zmiana globalnej wielkości czcionki w czasie wykonywania
- 21. Zmiana wielkości argumentu dostarczonego do makra preprocesora C
- 22. Pomiar wzrostu wielkości sterty po wczytaniu dużego obiektu
- 23. Co decyduje o wielkości zapisanego obiektu w R?
- 24. Android NumberPicker ukrywa przyciski zwiększania i zmniejszania
- 25. wykonawcze OnValueChange do NumberPicker w Androidzie
- 26. Utwórz okno dialogowe NumberPicker w preferencjach
- 27. Jak zmniejszyć rozmiar czcionki w NumberPicker
- 28. Brakuje numerów Android NumberPicker, DatePicker, strzałek TimePicker
- 29. Dokładny pomiar wielkości obiektów
- 30. Zmiana obiektu blokowania w zsynchronizowanej sekcji @
OK, ale to tak samo jak przy użyciu onScrollListener. Czy używanie zdarzeń jest jedynym sposobem na osiągnięcie tego efektu? – user940016
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
Metoda detektora powinna mieć wartość onValueChange zamiast onChange, a ustawnik powinien być teraz ustawionyOnValueChangedListener. – Loolooii