前提・実現したいこと
CountDownTimerを利用してstartボタンを押すとタイマー(~秒)が起動し、終わったらカウントを1減らして再びタイマーを起動し、カウントが0になったところでセット数を1減らしカウントを4に戻すことを繰り返しセット数が0になるまで続けたい。
for文を使って上手く作りたいのですがどこに入れればよいかわかりません。
拙いコードですが実現に向けての改善すべきところを教えていただけますか。
※気になるところ(下のソースコード)
ここに記述した処理を繰り返し前のtimer処理が終わった段階で呼びたい
該当のソースコード
package com.example.workouttimer; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; import android.database.Cursor; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.ProgressBar; import android.widget.TextView; import java.util.Locale; public class CountDownTimer extends AppCompatActivity implements View.OnClickListener { private TextView tvTimeLeft, mSetNumber, mCountNumber; private Button mButtonStartStop, mButtonReset; private android.os.CountDownTimer mCountDownTimer; private ProgressBar pb; private final static int ONE_SECOND = 1000; private String name; private int workout_time; private int rest_time; private int set_count; private int set_number; private int set_during; private boolean mTimerRunning = false; private long mStartTimeInMillis; private long mEndTime; private long mTimeLeftInMillis;// TimeLeft:残り時間 Millisecond:ミリ秒 略してる private int progressStatus = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_count_down_timer); tvTimeLeft = findViewById(R.id.timeLeft); mButtonStartStop = findViewById(R.id.button_start_stop); mButtonReset = findViewById(R.id.button_reset); mSetNumber = findViewById(R.id.setNumber); mCountNumber = findViewById(R.id.countNumber); //データベースからトレーニングの中身を取得する Intent intent = getIntent(); int id = intent.getIntExtra("id", 0); Cursor cursor = NewListItemActivity.mSQLiteHelper.getData("SELECT * FROM WORKOUTLIST WHERE id=" + id); while (cursor.moveToNext()) { name = cursor.getString(1); workout_time = cursor.getInt(2);//トレーニング時間 rest_time = cursor.getInt(3);//休憩時間 set_count = cursor.getInt(4);//カウント set_number = cursor.getInt(5);//セット数 set_during = cursor.getInt(6);//セット間の休憩時間 } pb = findViewById(R.id.pb); setTimeAndProgress(workout_time, workout_time * 1000); mCountNumber.setText(String.valueOf(set_count)); mSetNumber.setText(String.valueOf(set_number)); mButtonStartStop.setOnClickListener(this); mButtonReset.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.button_start_stop: if (mTimerRunning) { pauseTimer(); } else { startTimer(); } break; case R.id.button_reset: resetTimer(); break; default: break; } } private void setTimeAndProgress(int progress, long millisecond) { mStartTimeInMillis = millisecond;// セットで受け取った時間をmStartTimeInMillis(開始時間)に格納 mTimeLeftInMillis = mStartTimeInMillis; int progressBarMaximumValue = progress * 2; //Set ProgressBar maximum value pb.setMax(progressBarMaximumValue); updateFontText(); // resetTimer(); } private void resetTimer() { mTimeLeftInMillis = mStartTimeInMillis; //残り時間に格納 progressStatus = 0;//初期値 pb.setProgress(progressStatus); updateFontText(); updateWatchInterface(); } private void pauseTimer() { mCountDownTimer.cancel(); mTimerRunning = false; updateWatchInterface(); } //原因 private void startTimer() { for (int i = set_number; 0 < i; i--) {//3 for (int j = set_count; 0 < j; j--) {//4 mEndTime = System.currentTimeMillis() + mTimeLeftInMillis; mCountDownTimer = new android.os.CountDownTimer(mTimeLeftInMillis, 500) { @Override public void onTick(long millisUntilFinished) { mTimeLeftInMillis = millisUntilFinished; updateFontText(); progressStatus += 1; pb.setProgress(progressStatus); } @Override public void onFinish() { mTimerRunning = false; mButtonStartStop.setText("Start"); updateWatchInterface(); } }.start(); mTimerRunning = true; updateWatchInterface(); } } } //残り時間から表示するテキストのフォントスタイルを決める private void updateFontText() { int minutes = (int) ((mTimeLeftInMillis / 1000) % 3600) / 60; int seconds = (int) (mTimeLeftInMillis / 1000) % 60; String timeLeftFormatted; if (minutes > 0) { timeLeftFormatted = String.format(Locale.getDefault(), "%02d:%02d", minutes, seconds); } else { timeLeftFormatted = String.format(Locale.getDefault(), "%02d", seconds); } tvTimeLeft.setText(timeLeftFormatted);//<-second } //条件によってボタンの出現を切り替える private void updateWatchInterface() { if (mTimerRunning) {//true mButtonReset.setVisibility(View.INVISIBLE); mButtonStartStop.setText("Stop"); } else {//false mButtonReset.setVisibility(View.VISIBLE); mButtonStartStop.setText("Start"); if (mTimeLeftInMillis < 1000) { mButtonStartStop.setVisibility(View.INVISIBLE);//残り時間が1秒を切ったらstart/stopボタンを見えなくする } else { mButtonStartStop.setVisibility(View.VISIBLE);//それ以外start/stopボタンを見える } if (mTimeLeftInMillis < mStartTimeInMillis) { mButtonReset.setVisibility(View.VISIBLE); } else { mButtonReset.setVisibility(View.INVISIBLE); } } } }
変更箇所 private void showWorkout(Workout workout) { countTextView.setText(""+workout.getCount()); setTextView.setText(""+workout.getSet()); // progressBar.setProgress(workout.getTick()); ObjectAnimator animation = ObjectAnimator.ofInt(progressBar,"progress",workout.getTick()); animation.setDuration(500); // 0.5 secondかけて実行する animation.start(); int left = workout.getLeftSecond(); int minute = left / 60; int second = left % 60; lefttimeTextView.setText(String.format((minute>0?"%1$02d:":"")+"%2$02d", minute, second)); } int getTick() { return currentTick; }//書き換え void start(Listener listener) { this.listener = listener; long millisInFuture = (tick+tickMax*(count*set-1))*1000L/PARTICLE_SIZE; countDownTimer = new CountDownTimer(millisInFuture, 1000L/PARTICLE_SIZE) { //[ms] @Override public void onTick(long millisUntilFinished) { tick --; currentTick++; if(tick < 0) { tick = tickMax -1;//切り替わったときに一秒増えないように調整 currentTick = 1;//tuiki if(--count <= 0) { set --; count = countMax; } } Workout.this.listener.progress(Workout.this); } @Override public void onFinish() { currentTick = 0;//追記 tick = 0; count = 0; set = 0; Workout.this.listener.finish(Workout.this); Workout.this.listener = null; } }.start(); listener.start(Workout.this); }
試したこと
private void active() {
for (int i = set_number; 0 < i; i--) {//3
for (int j = set_count; 0 < j; j--) {//4
startTimer();
}
}
}
をonClickでstartTimer();を呼ぶ代わりにactive();を呼んでみたが
思い通りにならなかった。
補足情報(FW/ツールのバージョンなど)
android studio 3.6.1
回答1件
あなたの回答
tips
プレビュー