Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/200.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 设置NumberPicker的增加/减少间隔_Android - Fatal编程技术网

Android 设置NumberPicker的增加/减少间隔

Android 设置NumberPicker的增加/减少间隔,android,Android,是否可以将NumberPicker的增加/减少间隔设置为其他值?例如到50(50、100、150、200、250等)?或者它需要一些定制/破解吗?我想你可以这样做: 为您的选择器初始化a: int NUMBER_OF_VALUES = 10; //num of values in the picker int PICKER_RANGE = 50; ... String[] displayedValues = new String[NUMBER_OF_VALUES]; //Populate t

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

我想你可以这样做:

  • 为您的选择器初始化a:

    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);
    
    //获取选择器中的当前值
    choosenValue=displayedValues[numPicker.getValue()];
    //设置新值(例如150)
    
    对于(int i=0;i@iturki的最后一个点设置一个值。 因为valueInNumberPicker X PICKER_RANGE=ValueInPlayedValueArray 因此,我们可以通过以下方式避免for循环:

    // PICKER_RANGE= 50 so 150/50 -1 = 2, numPicker.setValue(2) == 150
    numPicker.setValue(150/PICKER_RANGE -1); 
    
    我的2美分


    顺便说一句,iturki的回答很好。

    我使用了onScrollListener以不同的步长滚动,使用onValueChanged以处理数字键盘的直接输入。使用时,您需要两个监听器中都可用的变量oldValue

    int oldValue = 0;
    
    在onScrollListener中,我使用STATE_IDLE仅仅是因为它可以工作,我不理解这三种用法之间的100%区别……我认为您可以将它们用于此目的

    在滚动之前,您需要全局oldValue变量来知道旧值。我还没有找到其他解决方案。if子句是最小(0)和最大(1000)边界

    这三个调用更新我的元素(vites是一个耦合的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);
    
            }
        });
    
    speedPicker.setOnScrollListener(新的OnScrollListener(){
    CrollStateChange上的公共无效(NumberPicker speedPicker,int scrollState){
    if(scrollState==NumberPicker.onscrollllistener.SCROLL\u STATE\u IDLE){
    if(speedPicker.getValue()=100)
    oldValue-=100;
    其他的
    oldValue=0;
    }
    否则{
    
    如果(speedPicker.getValue()一天中有点晚,但这对我来说很有用

        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));
            }
        });
    
    numberPicker.setOnValueChangedListener(新的numberPicker.OnValueChangeListener(){
    @凌驾
    值更改时的公共无效(NumberPicker NumberPicker、int-oldVal、int-newVal){
    如果(newVal>oldVal){
    numberPicker.setValue(newVal+(myInterval-1));
    }else if(newVal
    感谢您的回复和建议的解决方案。但是,我不想限制用户在选择器中输入任何精确的值。例如,如果您想输入值47或48,您应该可以自由地这样做。如果双击选择器,这也是数字选择器的默认行为。因此,您的问题不是关于
    INumberPicker的递增/递减间隔
    ?!当然可以。我想要的是在滚动或使用NumberPicker的上/下箭头时预设递增/递减间隔。但是如果您作为用户想要在这些间隔之间输入更精确的值,您应该被允许这样做,这是NumberPicker的默认行为。我还没有测试d你的解决方案还没有,所以它可能按照这里所描述的那样工作。但是我必须在开始时添加一些东西,比如说4-5英寸/减少1被onValueChange识别,然后值改变100。
        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));
            }
        });