5

是否可以将 NumberPicker 的增加/减少间隔设置为其他值?例如到 50(50、100、150、200、250 等)?还是需要一些定制/破解?

4

4 回答 4

7

我认为你可以这样做:

  • 为您的选择器初始化显示的数组值

    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。如果您愿意,可以查看并使用它。

于 2012-08-12T23:07:22.810 回答
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中查看他的答案

于 2013-07-19T06:39:28.693 回答
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 的回答很好。

于 2013-05-28T10:35:56.780 回答
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));
        }
    });
于 2020-11-05T04:50:30.533 回答