用户输入和计时器(java android应用程序)

用户输入和计时器(java android应用程序),java,android,Java,Android,所以我想把计时器做成秒表,但我是个十足的傻瓜。我试着“结合”来自和的东西 我们的目标是让用户输入他们想要设置计时器的时间,然后当时间到了,它就开始工作了 这就是我到目前为止所做的: package com.example.timer; import android.app.Activity; import android.os.Bundle; import android.os.CountDownTimer; import android.view.Menu; import android.v

所以我想把计时器做成秒表,但我是个十足的傻瓜。我试着“结合”来自和的东西

我们的目标是让用户输入他们想要设置计时器的时间,然后当时间到了,它就开始工作了

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

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;
}
}
没什么值得注意的

  • 该活动希望开始时间以毫秒为单位。如果输入值大于1000(例如10秒,即10000),应用程序将显示倒计时

  • 以下两行放置不正确

    countDownTimer = new MyCountDownTimer(timeVal, interval);
    text.setText(text.getText() + String.valueOf(timeVal / 1000));
    
    只有在开始倒计时时才应执行它们。但是在给定的实现中,它们在开始和停止时都运行

  • 因此,当倒计时停止时,将创建一个新的MyCountDownTimer,并且countDownTimer.cancel()将被删除;在这个新对象中调用,而不是在原始对象中调用。所以倒计时还在继续

    由于setText在start和stop时都执行,因此timeVal被追加到输出中。这会导致观察到“时间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();
        
            }
    

    这段代码有什么问题?它不会倒计时。按钮变为停止,但不是倒计时,而是显示“Times up”。如果你再按一下按钮,它会变为重新启动并显示“Times up0”。搞定了,现在我只需要整理一下你的第一点,谢谢你的详细回答!