Android 使用两个倒数计时器

Android using two countdowntimers

在我的应用中,我使用了两个具有相同值的不同 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();
    }
});

我已经检查了你的代码。

这很明显,因为您的计时器已使用默认值初始化。当您重新开始时,它不会采用 white/black.

的新值

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

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

制作两种方法

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;

希望对您有所帮助。

快乐编码。

我已经测试过了并且有效!

我有两个 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。无论你在这里放什么都没关系。我只有这个,以便计时器将被初始化为一些值。 原因是必须对它们进行初始化,以便稍后在 OnClickListener.cancel() 它们。

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();
    }
});