如何使倒数计时器重复

时间:2017-05-27 12:03:10

标签: java android timer countdowntimer

这是我第一次使用Android Studio,我的Java技能基本上不存在,所以我需要对我正在处理的项目提供一些帮助。       我需要制作一个在一定休息后重复的计时器。用户应该决定计时器重复的次数以及休息的持续时间。       到目前为止,我做了标准倒数计时器,但无论我尝试什么,我都不能重复

这是我到目前为止的工作代码  接口:

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.asus.timer.MainActivity"
android:padding="20dp"
android:orientation="vertical"
>


<EditText
    android:id="@+id/editTextSession"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:ems="10"
    android:inputType="numberDecimal"
    android:padding="20dp"
    android:hint="Session (seconds)"
    android:textAlignment="center"
    />

<EditText
    android:id="@+id/editTextBreak"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:ems="10"
    android:inputType="numberDecimal"
    android:padding="20dp"
    android:hint="Break (seconds)"
    android:textAlignment="center"
    />

<EditText
    android:id="@+id/editTextRepeats"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:ems="10"
    android:inputType="numberDecimal"
    android:padding="20dp"
    android:hint="Repeats"
    android:textAlignment="center"
    />

<Button
    android:id="@+id/buttonStart"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Start!"
    android:padding="20dp"
    />

<TextView
    android:id="@+id/textViewTimer"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text=""
    android:padding="20dp"
    android:textAlignment="center"
    android:textSize="60dp"
    android:paddingTop="40dp"
    android:gravity="center"
    />

功能

public class MainActivity extends AppCompatActivity {

EditText editTextSession;
EditText editTextBreak;
EditText editTextRepeats;
Button buttonStart;
TextView textViewTimer;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    editTextSession =(EditText) findViewById(R.id.editTextSession);
    editTextBreak =(EditText) findViewById(R.id.editTextBreak);
    editTextRepeats =(EditText) findViewById(R.id.editTextRepeats);
    buttonStart =(Button) findViewById(R.id.buttonStart);
    textViewTimer =(TextView) findViewById(R.id.textViewTimer);

    buttonStart.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            String text = editTextSession.getText().toString();
            int seconds = Integer.valueOf(editTextSession.getText().toString());
            CountDownTimer countDownTimer = new CountDownTimer(seconds * 1000, 1000) {
                @Override
                public void onTick(long millis) {
                    textViewTimer.setText("time:" + (int) (millis / 1000));
                }

                @Override
                public void onFinish() {
                    extViewTimer.setText("Finished!");
                }
            }.start();
        }
    }
);

3 个答案:

答案 0 :(得分:0)

如果您正在寻找另一种创建计时器的方法,可以使用Runnable()执行此类操作:

private TextView timeCounterTextView;
private int smsTimeOut = 10; // 10 SECONDS
private Runnable timeCounterRunnable = new Runnable() {
    @Override
    public void run() {

        if (smsTimeOut == 1) {
            //Do whatever when timeout
        }
        smsTimeOut--;
        timeCounterTextView.setText(String.valueOf(smsTimeOut));
        handler.postDelayed(this, 1000);
    }
};

每当您想要开始倒计时时,使用init()方法初始化并启动计时器,如下所示:

private void init(){
    handler.removeCallbacks(timeCounterRunnable);
    smsTimeOut = 10;
    handler = new Handler();
    handler.post(timeCounterRunnable);
}

只要您想重复,就可以再次致电init()

希望这会有所帮助。

答案 1 :(得分:0)

您是否尝试过Integer.parseInt(String value)而不是Integer.valueOf(String value)?也许它会产生差异。如果有人输入了错误的值,您可以添加例外。

答案 2 :(得分:0)

使用此

timer.start();

然后停止:

timer.cancel();

示例:

String text = editTextSession.getText().toString();
int seconds = Integer.valueOf(text);

//get how many repeat
String repeatText = editTextSession.getText().toString();
int repeat = Integer.valueOf(repeatText);

int count= 0;

CountDownTimer countDownTimer = new CountDownTimer(seconds * 1000, 1000) {
    @Override
    public void onTick(long millis) {
        textViewTimer.setText("time:" + (int)(millis / 1000));
    }

    @Override
    public void onFinish() {
        extViewTimer.setText("Finished!");
        count++;
        //check if count still less than repeat number
        if(count < repeat){
             Runnable r = new Runnable() {
                     public void run() {
                        countDownTimer.start();
                     }};

             new Handler().postDelayed(r,2000); //delay repeat timer 2 seconds 

        }
        else{
             countDownTimer.cancel();
             count = 0;
        }
    }
}.start();