用户输入和计时器(java android app)

时间:2014-01-15 02:56:31

标签: java android

所以我试图制作一个像秒表一样的计时器,但我是一个完整的菜鸟。我尝试“合并”HereHere中的内容。

我们的目标是让用户输入他们想要设置计时器的时间,然后在时间到了之后它就可以了。

这是我到目前为止所做的:

package com.example.timer;

import android.app.Activity;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends Activity {
private CountDownTimer countDownTimer;
private boolean timerHasStarted = false;
public TextView text;
private final long interval = 1 * 1000;
EditText editTime1;
Button startButton;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    editTime1 = (EditText)findViewById(R.id.editTime1);     
    startButton = (Button)findViewById(R.id.startButton);
    text = (TextView) this.findViewById(R.id.timer);
    startButton.setOnClickListener(new OnClickListener() { 

        public void onClick(View v) {
            //get the name from edittext and storing into string variable
            long timeVal = Long.parseLong(editTime1.getText().toString());
            countDownTimer = new MyCountDownTimer(timeVal, interval);
            text.setText(text.getText() + String.valueOf(timeVal / 1000));

            if (!timerHasStarted) {
                   countDownTimer.start();
                   timerHasStarted = true;
                   startButton.setText("STOP");
                  } else {
                   countDownTimer.cancel();
                   timerHasStarted = false;
                   startButton.setText("RESTART");
                  }
            }
        class MyCountDownTimer extends CountDownTimer {
          public MyCountDownTimer(long timeVal, long interval) {
           super(timeVal, interval);
          }

          @Override
          public void onTick(long millisUntilFinished) {
           text.setText("" + millisUntilFinished / 1000);
          }
          @Override
          public void onFinish() {
           text.setText("Times up");
          }
         }
        });
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}
}

2 个答案:

答案 0 :(得分:1)

很少有事情要注意。

  1. Activity期望开始时间以毫秒为单位。如果输入值大于1000(例如10秒,即10000),则应用程序会显示倒计时。

  2. 以下两行放错了。

    countDownTimer = new MyCountDownTimer(timeVal, interval);
    text.setText(text.getText() + String.valueOf(timeVal / 1000));
    

    只有在倒计时开始时才应执行它们。但是在给定的实现中,它们既可以在开始也可以在停止时运行。

  3. 结果,在倒计时停止时创建一个新的MyCountDownTimer,并且countDownTimer.cancel();在这个新对象而不是原始对象中调用。所以倒数仍在继续。

    由于在开始和结束时都执行了setText,因此timeVal会附加到输出中。这导致观察到“Times up0”。

    更新后的onClick方法如下。

        public void onClick(View v) {
            // get the name from edittext and storing into string variable
            long timeVal = Long.parseLong(editTime1.getText().toString());
    
            if (!timerHasStarted) {
                countDownTimer = new MyCountDownTimer(timeVal, interval);
                text.setText(text.getText() + String.valueOf(timeVal / 1000));
                countDownTimer.start();
                timerHasStarted = true;
                startButton.setText("STOP");
            } else {
                countDownTimer.cancel();
                timerHasStarted = false;
                startButton.setText("RESTART");
            }
        }
    

答案 1 :(得分:0)

我找到了一种方法。

基本上我让用户输入他们自己的值。

布局:HH:MM:SS

然后我从布局中获取这些值,然后处理如下:

EditText tv_hour = findViewById(R.id.timerHHValue);
        EditText tv_minute = findViewById(R.id.timerMMValue);
        EditText tv_second = findViewById(R.id.timerSSValue);

     long inputTime = TimeUnit.MINUTES.toMillis(minute) + TimeUnit.HOURS.toMillis(hour) + TimeUnit.SECONDS.toMillis(second);
    
            mCountDownTimer = new CountDownTimer(inputTime, 1000) {
                public void onTick(long millisUntilFinished) {
    
                    DecimalFormat f = new DecimalFormat("00");
                    long hours = (millisUntilFinished / 3600000) % 24;
    
                    long minutes = (millisUntilFinished / 60000) % 60;
    
                    long second = (millisUntilFinished / 1000) % 60;
    
                    tv_hour.setText(f.format(hours)+"");
                    tv_minute.setText(f.format(minutes)+"");
                    tv_second.setText(f.format(second)+"");
                }
    
    
                @Override
                public void onFinish() {
                    //    timerFinish.setVisibility(View.VISIBLE);
                    tv_hour.setText("00");
                    tv_minute.setText("00");
                    tv_second.setText("00");
    
    
                }
            }.start();
    
        }