如何在启用按钮的同时使CountDown显示/开始?

时间:2018-08-26 18:36:33

标签: java android android-button countdowntimer

“如何在启用Button的同时显示CountDown?”

有关按钮的其他信息:“按钮作业”是通过在Textview中显示的字符串数组单击5次,然后禁用5秒钟来再次执行相同的任务。

所以..我希望CountDown可以直观地显示这5秒钟(启用按钮的时间)倒数,以供用户查看。

不幸的是,我不知道如何将我的Button与CountDown连接起来,以使其知道在启用Button的特定时间应该倒数。

我也希望CountDown每次启用按钮时都启动。

我调查了https://developer.android.com/reference/android/os/CountDownTimer 但似乎没有针对该特定情况的解决方案。

那是我到目前为止的按钮代码:

next_button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            if (currentnumber == list.length) {
                currentnumber = 0;
            }
            if (Curclicks == mod - 1) {
                next_button.setEnabled(false);
                display.setText(list[currentnumber]);
                currentnumber++;


                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        //the button will unlock after the delay specified
                        next_button.setEnabled(true);
                        Curclicks = 0;

                    }
                }, delay);

            } else {
                display.setText(list[currentnumber]);
                currentnumber++;

            }
            Curclicks++;

        }

    });

UI线程代码可以解决吗? :

  private void runThread() {

            new Thread() {
                public void run() {
                    while (delay == 5000) { //delay = 5000 ( 5 secs)
                        try {
                            runOnUiThread(new Runnable() {

                                @Override
                                public void run() {
                                    timer.setText("" + delay);//timer=TxtView
                                }
                            });
                            Thread.sleep(300);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }.start();

3 个答案:

答案 0 :(得分:0)

此函数应执行您想要的操作,只需将其调用OnClickListener

public void countDown(Button yourBtn) {
    new Thread() {
        public void run() {
            try {
                int second = 10;
                for (int i = second; i >= 1; i--) {
                    int finalI = i;
                    yourBtn.post(new Runnable() {
                        @Override
                        public void run() {
                            yourBtn.setText(String.valueOf(finalI))
                        }
                    });
                    Thread.sleep(1000); // Change text every 1s
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }.start();
}

答案 1 :(得分:0)

这是一个示例,说明如何使用postDelayed()的{​​{1}}方法创建倒计时。我故意使代码有些冗长,因此您可以逐步进行操作以查看发生了什么。

创建一些类变量和常量。

Handler

private static final long COUNT_DOWN_TICKS = 100l; private static final long COUNT_DOWN_FINISH = 5000l; private long countdownElapsed = 0l; private Handler mCountDownHandler = new Handler(); 设置为5000-> 5秒。但是可以更改为您需要的任何内容。同样,我将COUNT_DOWN_FINISH设置为100-> 0.1秒,以防万一您想显示更精确的倒数。

在您的COUNT_DOWN_TICKS方法中,只需调用OnClick()即可开始计数。

startCountDown()

为了正确处理private void startCountDown() { try { countdownElapsed = 0l; next_button.setEnabled(false); displayCountDown(); mCountDownHandler.postDelayed(mCountDownRunnable, COUNT_DOWN_TICKS); } catch (Exception ex){ Log.e(TAG, ex.getMessage()); } } private Runnable mCountDownRunnable = new Runnable() { @Override public void run() { countdownElapsed = countdownElapsed + COUNT_DOWN_TICKS; if(countdownElapsed >= COUNT_DOWN_FINISH){ releaseCountDownHandler(); next_button.setEnabled(true); } else{ mCountDownHandler.postDelayed(mCountDownRunnable, COUNT_DOWN_TICKS); } long secFull = countdownElapsed % 1000; if(secFull == 0){ runOnUiThread(new Runnable() { @Override public void run() { displayCountDown(); } }); } } }; private void releaseCountDownHandler() { try { if(mCountDownRunnable != null) { mCountDownHandler.removeCallbacks(mCountDownRunnable); } } catch (Exception ex){ Log.e(TAG, ex.getMessage()); } } private void displayCountDown(){ long t = (COUNT_DOWN_FINISH - countdownElapsed)/1000; String myTime = String.valueOf(t); timer.setText(myTime); } ,您将需要通过Runnable方法调用releaseCountDownHandler()。这只是短暂运行的onPause(),但仍然不应忽略它。

Thread方法相比,我更喜欢将HandlerpostDelay()方法一起使用-有关使任何线程进入睡眠状态的事情令人感到困惑。另请注意,根据实现的不同,习惯用“> =” RATHER而不是“ ==”来检查经过的时间条件是个好主意(例如,您使用Thread.sleep()),该条件可能会错过确切的时间值!


编辑


在您的SystemClock.elapsedRealtime()类的定义下的某个地方(对于本示例,我将其称为Activity),您将需要声明一些变量。由于它们是在类内部定义的,而不是在方法内部定义的,因此被称为“类变量”,并且在定义为“私有”时它们具有整个类的作用域。

MainActivity

您可能已经在public class MainActivity extends AppCompatActivity { //class variables private static final long COUNT_DOWN_TICKS = 100l; private static final long COUNT_DOWN_FINISH = 5000l; private long countdownElapsed = 0l; private Handler mCountDownHandler = new Handler(); private Button next_button; private TextView timer; .... } 类的onClick()方法内声明了onCreate()方法。因此,只需添加以下代码:

MainActivity

我提供的所有其他内容都是next_button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startCountDown(); } 类内部的方法,而没有其他任何方法。因此,在MainActivity方法下面,添加我之前发布的所有方法。

它看起来像这样:

onCreate()

答案 2 :(得分:0)

除了上面的代码引入了“点击计数器”之外,该代码类似于我上面的代码。我引入了一个新的类变量来跟踪单击按钮的次数。我还引入了一个名为“ NUMBER_OF_BUTTON_CLICKS”的新常数,该常数用作点击的上限。

用户现在可以单击按钮5次(在这种情况下)。在第五次单击时,满足触发startCountDown方法的条件,并且按钮已禁用5秒钟。

public class MainActivity extends AppCompatActivity {
    //Constant values    
    private static final String TAG = MainActivity.class.getSimpleName();
    private static final int NUMBER_OF_BUTTON_CLICKS = 5;
    private static final long COUNT_DOWN_TICKS = 100l;
    private static final long COUNT_DOWN_FINISH = 5000l;

    //class variables
    private int howManyClicks = 0;
    private long countdownElapsed = 0l;
    private Handler mCountDownHandler = new Handler();
    private Button next_button;
    private TextView timer;
    private TextView clicks;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // you must compensate for the actual layout for your activity
        setContentView(R.layout.activity_main);


        // you must compensate for the actual id of the TextView
        timer = findViewById(R.id.tvTimer);

        // Use this only if you want to display the number of clicks 
        // you might need to add this TextView if you want to display the number of clicks
        clicks = findViewById(R.id.tvClicks);

        // you must compensate for the actual id of the Button
        next_button = findViewById(R.id.btnNext);
        next_button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                howManyClicks++;
                if(howManyClicks >= NUMBER_OF_BUTTON_CLICKS){
                    startCountDown();
                }

                //Add this only if you want to see how many clicks were made
                String myClicks = String.valueOf(howManyClicks);
                clicks.setText(myClicks)
            }
        });
    }

    private void startCountDown() {
        try {
            countdownElapsed = 0l;
            next_button.setEnabled(false);
            displayCountDown();
            mCountDownHandler.postDelayed(mCountDownRunnable, COUNT_DOWN_TICKS);
        }
        catch (Exception ex){
            Log.e(TAG, ex.getMessage());
        }
    }

    private Runnable mCountDownRunnable = new Runnable() {
        @Override
        public void run() {
            countdownElapsed = countdownElapsed + COUNT_DOWN_TICKS;

            if(countdownElapsed >= COUNT_DOWN_FINISH){
                releaseCountDownHandler();
                next_button.setEnabled(true);
                // reset the clicks counter
                howManyClicks = 0;
            }
            else{
                mCountDownHandler.postDelayed(mCountDownRunnable, COUNT_DOWN_TICKS);
            }

            long secFull = countdownElapsed % 1000;
            if(secFull == 0){
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        displayCountDown();
                    }
                });
            }
        }
    };

    private void releaseCountDownHandler() {
        try {
            if(mCountDownRunnable != null) {
                mCountDownHandler.removeCallbacks(mCountDownRunnable);
            }
        }
        catch (Exception ex){
            Log.e(TAG, ex.getMessage());
        }
    }


    private void displayCountDown(){
        long t = (COUNT_DOWN_FINISH - countdownElapsed)/1000;
        String myTime = String.valueOf(t);
        timer.setText(myTime);

        //Add this only if you want to see how many clicks were made
        String myClicks = String.valueOf(howManyClicks);
        clicks.setText(myClicks)
    }   

}