【问题标题】:Problems with starting and stopping CountDownTimer with buttons使用按钮启动和停止 CountDownTimer 的问题
【发布时间】:2014-06-12 20:52:43
【问题描述】:

我有一个用于以分钟为单位输入时间的编辑文本,一个使用在编辑文本中输入的分钟数来启动倒数计时器的按钮,用于更新文本视图,以及一个我想在倒数计时器完成之前取消倒数计时器的按钮.

我遇到的问题是……在我单击开始计时器按钮之前,无法分配倒数计时器所需的变量(毫秒),因为它来自编辑文本。所以我在 onClick 内部为开始计时器按钮创建了倒数计时器。但是...我想要另一个按钮来取消计时器...并且它无法访问倒数计时器。所以这并没有解决任何问题,我对如何做到这一点感到困惑。任何建议都会有所帮助。

编辑:我刚刚意识到我可以将带有侦听器的停止计时器按钮移动到开始计时器按钮 onClick 也...在倒计时计时器下。如果我在开始计时器 onClick 之外有倒计时计时器,我只是对倒计时计时器如何找到毫秒变量感到困惑。我想在倒数计时器下移动停止计时器是可行的……但我仍然觉得我错过了一些东西。

Edit2:我尝试将 countDownTimer 移动到 onCreate 中并使毫秒为全局...但我必须将 countDownTimer 设置为 final 才能使按钮能够使用它,并且 countDownTimer 只是跳到 onFinish。

    mTimerTextView = (TextView)findViewById(R.id.timer_text_view);
    mTimerEditText = (EditText)findViewById(R.id.timer_edit_text);

    mStartTimerButton = (Button)findViewById(R.id.btn_start_timer);
    mStartTimerButton.setOnClickListener(new View.OnClickListener() {           
        @Override
        public void onClick(View v) {

            // Getting time in minutes from edit text
            int timeEntered = Integer.parseInt(mTimerEditText.getText().toString());
            long milliseconds = timeEntered * 60000;

            CountDownTimer countDownTimer = new CountDownTimer(milliseconds, 1000) {

                @Override
                public void onTick(long millisUntilFinished) {
                    int seconds = (int) (millisUntilFinished / 1000) % 60;
                    int minutes = (int) ((millisUntilFinished / (1000*60)) % 60);
                    int hours   = (int) ((millisUntilFinished / (1000*60*60)) % 24);
                    mTimerTextView.setText(String.format("%02d:%02d:%02d", hours, minutes, seconds));               
                }

                @Override
                public void onFinish() {
                    new AlertDialog.Builder(DailyGoalActivity.this)
                        .setTitle("Time's Up")
                        .setPositiveButton("OK", new DialogInterface.OnClickListener() {                        
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                dialog.cancel();                            
                            }
                        }).show();
                }           
            };
            countDownTimer.start();
        }
    });

    mStopTimerButton = (Button)findViewById(R.id.btn_stop_timer);
    mStopTimerButton.setOnClickListener(new View.OnClickListener() {            
        @Override
        public void onClick(View arg0) {
            // countDownTimer.cancel(); <- How could I do this? 
        }
    });

【问题讨论】:

    标签: android countdowntimer


    【解决方案1】:

    您的问题有两个可能的原因,第一个是您需要在 onCreate 中创建倒数计时器,第二个是您正在停止空倒数计时器。

    solution-1 您可以使用布尔变量来检查计时器是否已启动,然后在单击按钮时相应地启动计时器。除了在创建时初始化计时器并在单击时启动时跟随此代码请关注此link

    solution-2 使用此代码停止计时器

    if(countDownTimer != null) {
         countDownTimer .cancel();
         countDownTimer = null;
     }
    

    【讨论】:

      【解决方案2】:

      全局声明 CountDownTimer 变量不是简单的解决方案吗?

      将此代码移至onCreate

      CountDownTimer countDownTimer = new CountDownTimer(milliseconds, 1000) {
      
          @Override
          public void onTick(long millisUntilFinished) {
              int seconds = (int) (millisUntilFinished / 1000) % 60;
              int minutes = (int) ((millisUntilFinished / (1000*60)) % 60);
              int hours   = (int) ((millisUntilFinished / (1000*60*60)) % 24);
              mTimerTextView.setText(String.format("%02d:%02d:%02d", hours, minutes, seconds));               
          }
      }
      

      然后在 Start 按钮的 onClick 中启动计时器并在 Stop 按钮的 onClick 中取消。

      希望对你有帮助。

      【讨论】:

      • countDownTimer 必须是最终的,以便按钮能够使用它......我不知道如何让它使用在启动计时器中分配的毫秒数。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多