在我的应用中,我使用两个具有相同值的CountDownTimers
。我有两个按钮来控制它们但是当我按下按钮两次时,它从头开始。我想保留它的最后一个值。
这是我的代码:
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();
}
});
答案 0 :(得分:1)
我检查了你的代码。
很明显,因为你的计时器是用默认值初始化的。当你再次开始时,它不会采用白色/黑色的新值。
要实现您的目标,您必须在启动计时器之前使用新值初始化计时器。
我在你的代码中做了一些修正。你可以检查一下。
制作两种方法
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();
}
并像这样设置setOnClickListener
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();
}
}
});
更新:
请检查更新的代码并获取这些额外的变量
boolean isRunning1 = false, isRunning2 = false;
希望这会对你有所帮助。
快乐编码。
答案 1 :(得分:1)
我测试了这个并且它有效!
我有两个TextView
和两个Button
。黑色按钮位于黑色文本视图旁边,白色按钮位于白色文本视图旁边。
首先,我宣布重要的常数。
//contains the elapsed time for each of the timers
long blackElapsed=0,whiteElapsed=0;
//contains the total time with which we start new timers
long totalWhite = 30000;
long totalBlack = 30000;
接下来,我初始化CountDownTimers
。无论你在这里放什么都没关系。我只有这个,以便定时器初始化有一些价值。
原因是必须对它们进行初始化,以便能够在.cancel()
之后OnClickListener
对它们进行初始化。
black = new CountDownTimer(totalWhite, 1000){
@Override
public void onTick(long l) {
}
@Override
public void onFinish() {
}
};
white = new CountDownTimer(totalBlack, 1000){
@Override
public void onTick(long l) {
}
@Override
public void onFinish() {
}
};
最后是OnClickListener
的按钮。 (W
是白色textView,B
是黑色textView,b
是黑色按钮,w
是白色按钮)
w.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
black.cancel();
//using the elapsed time to start a new timer
totalBlack = totalBlack - blackElapsed;
//this preserves milliseconds by ticking every millisecond
white = new CountDownTimer(totalBlack, 1){
@Override
public void onTick(long l) {
B.setText(l+"");
blackElapsed=totalBlack-l; //updating the elapsed time
}
@Override
public void onFinish() {
}
}.start();
}
});
//we do a similar thing with the other player's button
b.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
white.cancel();
totalWhite = totalWhite - whiteElapsed;
black = new CountDownTimer(totalWhite, 1){
@Override
public void onTick(long l) {
W.setText(l+"");
whiteElapsed=totalWhite-l;
}
@Override
public void onFinish() {
}
}.start();
}
});