Java 使用两个倒计时的Android

Java 使用两个倒计时的Android,java,android,timer,countdowntimer,Java,Android,Timer,Countdowntimer,在我的应用程序中,我使用了两个不同的具有相同值的倒计时程序。我有两个按钮来控制它们,但当我按下两次按钮时,它会从头开始。我想保留它的最后一个值 这是我的代码: t1 = new CountDownTimer(white, 1000) { @Override public void onTick(long l) { btnWhite.setText("seconds remaining: " + l / 1000); white = l; }

在我的应用程序中,我使用了两个不同的具有相同值的
倒计时程序。我有两个按钮来控制它们,但当我按下两次按钮时,它会从头开始。我想保留它的最后一个值

这是我的代码:

t1 = new CountDownTimer(white, 1000) {
    @Override
    public void onTick(long l) {
        btnWhite.setText("seconds remaining: " + l / 1000);
        white = l;
    }

    @Override
    public void onFinish() {

    }
};

t2 = new CountDownTimer(black, 1000) {
    @Override
    public void onTick(long l) {
        btnBlack.setText("seconds remaining: " + l / 1000);
        black = l;
    }

    @Override
    public void onFinish() {

    }
};

btnBlack.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        t1.start();
        t2.cancel();
    }
});

btnWhite.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        t2.start();
        t1.cancel();
    }
});

我已经查过你的密码了

这是显而易见的,因为您的计时器是用默认值初始化的。当您再次启动时,它不会接受新的白/黑值

要实现您想要的,您必须在启动计时器之前用新值初始化计时器

我已经对你的代码做了一些修改。你可以看看

制定两种方法

public void timerStart1(long timeLengthMilli) {
    t1 = new CountDownTimer(timeLengthMilli, 1000) {
        @Override
        public void onTick(long l) {
            isRunning1 = true;
            tv1.setText("seconds remaining: " + l / 1000);
            white = l;
        }

        @Override
        public void onFinish() {
            isRunning1 = false;
        }
    }.start();
}

public void timerStart2(long timeLengthMilli) {
    t2 = new CountDownTimer(timeLengthMilli, 1000) {

        @Override
        public void onTick(long l) {
            isRunning2 = true;
            tv2.setText("seconds remaining: " + l / 1000);
            black = l;
        }

        @Override
        public void onFinish() {
            isRunning2 = false;
        }
    }.start();
}
button1.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        if (!isRunning1) {
            isRunning2 = false;
            timerStart1(white);
            if (t2 != null)
                t2.cancel();
        }
    }
});

button2.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        if (!isRunning2) {
            isRunning1 = false;
            timerStart2(black);
            if (t1 != null)
                t1.cancel();
        }
    }
});
并像这样设置setOnClickListener

public void timerStart1(long timeLengthMilli) {
    t1 = new CountDownTimer(timeLengthMilli, 1000) {
        @Override
        public void onTick(long l) {
            isRunning1 = true;
            tv1.setText("seconds remaining: " + l / 1000);
            white = l;
        }

        @Override
        public void onFinish() {
            isRunning1 = false;
        }
    }.start();
}

public void timerStart2(long timeLengthMilli) {
    t2 = new CountDownTimer(timeLengthMilli, 1000) {

        @Override
        public void onTick(long l) {
            isRunning2 = true;
            tv2.setText("seconds remaining: " + l / 1000);
            black = l;
        }

        @Override
        public void onFinish() {
            isRunning2 = false;
        }
    }.start();
}
button1.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        if (!isRunning1) {
            isRunning2 = false;
            timerStart1(white);
            if (t2 != null)
                t2.cancel();
        }
    }
});

button2.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        if (!isRunning2) {
            isRunning1 = false;
            timerStart2(black);
            if (t1 != null)
                t1.cancel();
        }
    }
});
更新:

t1 = new CountDownTimer(white, 1000) {
    @Override
    public void onTick(long l) {
        btnWhite.setText("seconds remaining: " + l / 1000);
        white = l;
    }

    @Override
    public void onFinish() {

    }
};

t2 = new CountDownTimer(black, 1000) {
    @Override
    public void onTick(long l) {
        btnBlack.setText("seconds remaining: " + l / 1000);
        black = l;
    }

    @Override
    public void onFinish() {

    }
};

btnBlack.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        t1.start();
        t2.cancel();
    }
});

btnWhite.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        t2.start();
        t1.cancel();
    }
});
请检查更新的代码并获取这些额外变量

boolean isRunning1 = false, isRunning2 = false;
希望这对你有帮助


快乐的编码。

我已经测试过了,它可以工作了

我有两个
TextView
s和两个
按钮
s。黑色按钮位于黑色文本视图旁边,白色按钮位于白色文本视图旁边

首先,我声明重要的常量

//包含每个计时器的运行时间
长时间黑色经过=0,白色经过=0;
//包含启动新计时器的总时间
长全白=30000;
长总黑=30000;
接下来,我初始化
倒计时程序
。不管你在这里放什么都没关系。我只有这样,计时器将初始化一些值。 原因是必须对它们进行初始化,以便以后在
OnClickListener
s中能够
.cancel()
它们

black=新的倒计时(totalWhite,1000){
@凌驾
公共空白条(长l){
}
@凌驾
公共无效onFinish(){
}
};
白色=新的倒计时(总黑色,1000){
@凌驾
公共空白条(长l){
}
@凌驾
公共无效onFinish(){
}
};
最后,
OnClickListener
s用于按钮。(
W
为白色文本视图,
B
为黑色文本视图,
B
为黑色按钮,
W
为白色按钮)

w.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
黑色。取消();
//使用经过的时间启动新计时器
totalBlack=totalBlack-Black已过;
//这通过每毫秒滴答一次来保持毫秒
白色=新的倒计时(总黑色,1){
@凌驾
公共空白条(长l){
B.setText(l+);
blackappeased=totalBlack-l;//更新经过的时间
}
@凌驾
公共无效onFinish(){
}
}.start();
}
});
//我们对另一个玩家的按钮也做了类似的事情
b、 setOnClickListener(新视图。OnClickListener(){
@凌驾
公共void onClick(视图){
白色。取消();
totalWhite=totalWhite-白色;
黑色=新的倒计时(全白色,1){
@凌驾
公共空白条(长l){
W.setText(l+);
whiteappeased=totalWhite-l;
}
@凌驾
公共无效onFinish(){
}
}.start();
}
});

这两个计时器的区别是什么?是按一个按钮两次,还是两个按钮都按一次,还是两个按钮都按两次?@KritixiLithos计时器相同,但工作时间可能不同。我正在尝试开发国际象棋时钟。我先按黑色按钮,然后按白色按钮,然后按黑色按钮。非常感谢,这很有帮助,但一个新的问题是我认为这段代码不能保持毫秒。例如,当我反复按这些按钮5秒钟时,计时器没有变化。就我而言,它工作正常。。我已经检查过了,直到两个计时器都没有结束。你能更具体地说明你的问题吗?因为我可能误解了你。很抱歉,我的问题是毫秒。例如,我启动两个定时器一次,我看到600599598等等。。然后我按下并等待了将近1秒钟(仍然是598秒,它还没有改变),然后我停止了它。但当我重新开始时,它必须被改变。我的意思是计时器没有保持毫秒。当我启动它时,它一次又一次地计数1000毫秒。对不起,英语不好。@CagriYalcin现在用什么?你说按钮不工作是什么意思?@CagriYalcin尝试交换
++blacktimepassed
++whitetimepassed
@CagriYalcin实际上还没有听我之前的建议,我在代码中犯了一个错误。再试一次now@CagriYalcin给我一些时间,我正在创建一个新项目进行测试this@CagriYalcin现在可以了!