如何通过暂停扩展CountDown计时器?

时间:2012-12-10 18:03:10

标签: android timer countdown

这似乎是一个常见的问题,“如何暂停倒数计时器”?

我发现这个代码看起来很有希望:

http://www.java2s.com/Open-Source/Android/Timer/multitimer-android/com/cycleindex/multitimer/CountDownTimerWithPause.java.htm

我只是不确定如何在代码中实现它。我需要覆盖抽象的方法并扩展类。有人能告诉我如何做到这一点吗?

2 个答案:

答案 0 :(得分:1)

这是你的布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
        >
    <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="0"
            android:gravity="center_horizontal"
            android:layout_marginBottom="40dp"
            android:layout_marginTop="20dp"
            android:textSize="27dp"
            android:id="@+id/txtView"/>
    <RelativeLayout
            android:layout_width="wrap_content"
            android:layout_height="fill_parent"
            android:layout_gravity="center">
        <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Start"
                android:id="@+id/startButton"/>
        <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Stop"
                android:id="@+id/stopButton"
                android:layout_toRightOf="@id/startButton"/>
    </RelativeLayout>
</LinearLayout>


这是您的活动类

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class MyActivity extends Activity implements View.OnClickListener {

    TextView txt = null;
    Button startButton = null;
    Button stopButton = null;
    CountDownTimerWithPause timer = null;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        txt = (TextView) findViewById(R.id.txtView);
        startButton = (Button) findViewById(R.id.startButton);
        stopButton = (Button) findViewById(R.id.stopButton);

        startButton.setOnClickListener(this);
        stopButton.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        if (view == startButton) {
            if (timer == null) {
                initTimer();
            }

            timer.resume();
        }

        if (view == stopButton) {
            timer.pause();
        }
    }

    private void initTimer() {
        timer = new CountDownTimerWithPause(10000, 1000, false) {
            @Override
            public void onTick(long millisUntilFinished) {
                Integer currentValue = Integer.valueOf((String) MyActivity.this.txt.getText());
                MyActivity.this.txt.setText(String.valueOf(currentValue + 1));
            }

            @Override
            public void onFinish() {
                Toast.makeText(MyActivity.this, "finish", Toast.LENGTH_SHORT).show();
            }
        };

        timer.create();
    }
}

不要忘记将CountDownTimerWithPause复制到您的包裹中。

适合我, ......

我提到了一些错误,但这取决于你的应用程序。也许你可以。错误是 - 当启动计时器时,它会立即触发。 '所以呢?'你可能会问。想象一下,当你经过3秒半后点击停止按钮。因此,当您单击“开始”按钮时,您希望在看到4之前经过半秒,但不会在该类实现中。

计算结束时有一些奇怪的延迟。我建议寻找更好的实施方案。

答案 1 :(得分:0)

我在我的项目中使用了CountDownTimerWithPause,这非常简单。 看看我刚写的这个示例代码来解释这个计数器的实现。

第1步

我已经创建了示例XML布局,以便稍后更好地解释。此布局包含3个按钮:

  1. 开始
  2. 暂停
  3. 简历
  4. 布局:

    <Button
        android:id="@+id/button_start"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Start" />
    
    <Button
        android:id="@+id/button_pause"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Pause" />
    
    <Button
        android:id="@+id/button_resume"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Resume" />
    

    第2步

    就本例而言,我在一个活动中工作。 所以这是代码:

    public class MainActivity extends Activity
    {
    
        private CountDownTimerWithPause _countDownTimerWithPause = null;
    
        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.timer);
    
            /*
             * Definition of the counter
             */
            _countDownTimerWithPause = new CountDownTimerWithPause(10000, 1000, true)
            {
    
                @Override
                public void onTick(long millisUntilFinished)
                {
                    Toast.makeText(getApplicationContext(), "Tick", Toast.LENGTH_SHORT).show();
                }
    
                @Override
                public void onFinish()
                {
                    Toast.makeText(getApplicationContext(), "Finished", Toast.LENGTH_SHORT).show();
                }
            };
    
            /*
             * Click to start the counter
             */
            Button buttonStart = (Button) findViewById(R.id.button_start);
            buttonStart.setOnClickListener(new View.OnClickListener()
            {
    
                @Override
                public void onClick(View v)
                {
                    _countDownTimerWithPause.create();
                }
            });
    
            /*
             * Click to pause the counter
             */
            Button buttonPause = (Button) findViewById(R.id.button_pause);
            buttonPause.setOnClickListener(new View.OnClickListener()
            {
    
                @Override
                public void onClick(View v)
                {
                    _countDownTimerWithPause.pause();
                }
            });
    
            /*
             * Click to resume the counter
             */
            Button buttonResume = (Button) findViewById(R.id.button_resume);
            buttonResume.setOnClickListener(new View.OnClickListener()
            {
    
                @Override
                public void onClick(View v)
                {
                    _countDownTimerWithPause.resume();
                }
            });
        }
    
    }
    

    很容易看出我如何扩展CountDownTimerWithPause以及应该调用哪些方法来启动,暂停和恢复计数器。

    希望我能解释一下这个计数器的用法。