是否可以将NumberPicker的增加/减少间隔设置为其他值?例如50(50,100,150,200,250等)?或者它需要一些定制/黑客?
答案 0 :(得分:6)
我认为你可以这样做:
为您的选择器初始化displayed array values:
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", .....}; */
将显示的数组设置为选择器:
/*
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);
当您想获取/设置选择器的值时:
//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);
最后,有一个名为android-wheel的易于定制的小工具。如果您愿意,可以查看并使用它。
答案 1 :(得分:0)
@ iturki设置值的最后一点。 因为valueInNumberPicker X PICKER_RANGE = valueInDisplayedValueArray 所以我们可以通过以下方式避免for循环:
// PICKER_RANGE= 50 so 150/50 -1 = 2, numPicker.setValue(2) == 150
numPicker.setValue(150/PICKER_RANGE -1);
我的2美分。
顺便说一句,iturki的答案很棒。
答案 2 :(得分:0)
我使用 onScrollListener 滚动不同的步长, onValueChanged 用于使用数字键盘处理直接输入。对于使用,您需要两个侦听器中都可用的变量oldValue。
int oldValue = 0;
在onScrollListener中,我使用了STATE_IDLE只是因为它有效,而且我不理解100%这三种用法之间的区别...认为你可以将它们用于此目的。
在滚动之前,您需要全局oldValue变量来知道旧值。我还没找到另一个解决方案。 if子句是min(0)和max(1000)寄存器。
speedPicker.setValue(oldValue);
vitess.setProgress(oldValue);
((MainActivity) getActivity()).setSpeed(oldValue);
这三个调用更新了我的元素(vitess是一个耦合的progressBar,speedPicker是numberPicker)。
在onValueChange中,我还更新了元素,并设置了oldValue。
顺便说一下,stepSize是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);
}
});
此代码在一些测试退出后对我有用。
这个答案的灵感来自jpintado。在Android NumberPicker OnValueChangeListener
中查看他的回答答案 3 :(得分:0)
一天有点晚,但这对我有用...
numberPicker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
@Override
public void onValueChange(NumberPicker numberPicker, int oldVal, int newVal) {
if (newVal > oldVal) {
numberPicker.setValue(newVal+(myInterval-1));
} else if (newVal < oldVal)
numberPicker.setValue(newVal-(myInterval-1));
}
});