millisUntilFinished我的倒数计时器不会根据用户输入改变

时间:2017-12-06 15:19:50

标签: android countdowntimer

这是我的问题: 我从两个numberPickers获得用户输入。然后我使用收集的数字来设置倒数计时器的millisInFuture。但问题是:无论我选择什么号码,倒数计时器的millisUntilFinished都不会根据用户输入而改变。 我的代码简化如下:

int firstMin = 1;
int firstSec = 30;//initial value in the field
int i = 1; //to determine whether the remained time should be shown

private void initFirstMinPicker() {
    minPicker.setMaxValue(60);
    minPicker.setValue(firstMin);//set the current value of number picker

    minPicker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
        @Override
        public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
            firstMin = newVal;//pass the selected int to firstMin

        }
    });


//My countdown timer is supposed to start on clicking a button
firstTimer = new CountDownTimer(firstMin * 60000, 500) {//use 500 to 
avoid skipping the last onTick()
        @Override
        public void onTick(long millisUntilFinished) {
            Log.d("TAG", "onTick:firstMin " + firstMin);
            if (i % 2 == 0) {
                workLeft.setText(String.valueOf(millisUntilFinished / 1000));
            }
            i++;
        }

        @Override
        public void onFinish() {

        }
    };

我的标签:

D/TAG: onTick:firstMin 6
D/TAG: onTick:firstMin 6
D/TAG: onTick:firstMin 6

很明显firstMin已被更改,但当我使用firstMin * 60000作为参数时,millisUntilFinished将始终从60000开始,无论firstMin * 60000评估到多少styleName="confirmation" 。也就是说,当我的倒数计时器开始倒计时时,它总是从60开始倒计时(firstMin * 60的初始值)。我不知道为什么会这样。你们有没遇到过这样的问题?非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

您只声明firstTimer一次,这意味着它只会在firstmin = 1时创建。每当调用firstTimer时,您都需要创建onValueChanged的新实例,例如:

minPicker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
    @Override
    public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
        firstMin = newVal;//pass the selected int to firstMin
        firstTimer = new CountDownTimer(firstMin * 60000, 500) { ... }
    }
});

创建一个返回新CountDownTimer的函数也是值得的,只需要firstMin的值并自动填充其余的默认值,以节省不必要的代码重复。