2012-08-12 242 views

回答

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一个伟大的易于定制部件。如果你喜欢,你可以检查出来并使用它。

+0

感谢您的回复和建议的解决方案。但是我不想限制用户在拾取器中放置任何精确的值。例如,如果你想要投入价值47或48,你应该自由地做到这一点。如果您双击选取器,这也是数字选取器的默认行为。 – 2012-08-13 06:38:27

+0

所以,你的问题不是关于NumberPicker的增加/减少间隔?! – iTurki 2012-08-13 07:23:22

+0

当然可以。我想要的是当滚动或使用NumberPicker的向上/向下箭头时,预设增加/减少的时间间隔。但是,如果您作为用户想要提供更精确的值,则应在这些间隔之间允许这样做,这是NumberPicker的默认行为。我还没有测试过你的解决方案,所以它可能会按照这里描述的那样工作。 – 2012-08-13 07:28:09

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伟大的答案。

0

我已经使用了onScrollListener与不同的步长滚动和onValueChanged处理直接输入与数字键盘。为了使用,您需要两个侦听器都可用的变量oldValue。

int oldValue = 0; 

在我使用的STATE_IDLE只是因为它的工作原理,我不明白,100%三个之间的使用差异onScrollListener ......想你可以使用他们要么为了这个目的。

您需要使用全局oldValue变量来了解滚动前的旧值。我还没有找到其他解决方案。 if子句是min(0)和max(1000)寄存器。

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

这三个调用更新我的元素(vitess是耦合progressBar,speedPicker是numberPicker)。

在onValueChange我更新元素,我设置oldValue。

顺便说步长在这里是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

+0

但我必须在开始时添加一些东西,比如4-5 in/decrease by 1被onValueChange所识别!之后,值变化100。 – KelvinGradCelsius 2013-07-19 10:21:30