[英]User input and timer (java android app)
所以我正在尝试制作一个像秒表一样的计时器,但我是一个完全的菜鸟。 我尝试“组合”来自Here和Here 的东西。
目标是让用户输入他们想要设置计时器多长时间,然后当时间到时它会做一些事情。
这是我到目前为止:
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;
}
}
要注意的事情很少。
Activity 预计开始时间以毫秒为单位。 如果给出的输入值大于 1000(例如 10 秒,即 10000),应用程序会显示倒计时。
以下两行放置不正确。
countDownTimer = new MyCountDownTimer(timeVal, interval); text.setText(text.getText() + String.valueOf(timeVal / 1000));
它们应该只在倒计时开始时执行。 但是在给定的实现中,它们在启动和停止时都运行。
结果,当倒计时停止时,会创建一个新的 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");
}
}
我找到了一种方法来做到这一点。
基本上我让用户输入他们自己的值。
布局 : 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();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.