Я пытаюсь реализовать CountDownTimer в приложении для Android. Этот таймер будет во время работы обратным отсчетом от значения, чем сброс, чем обратный отсчет с другого значения. Переключение назад и усиление между значениями до тех пор, пока не истечет заданное количество раундов или не будет нажата кнопка останова. Я могу заставить образцы CountDownTimer работать, но я думаю, что здесь что-то не хватает. Ниже приведен действующий код нажатия кнопки;CountDownTimer Проблема с Android
CounterState state = CounterState.WORKOUT;
private WorkoutTimer workoutTimer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.workout_stopwatch);
requestWindowFeature(Window.FEATURE_NO_TITLE);
// Set up OnClickListeners
((Button) findViewById(R.id.start_button)).setOnClickListener(this);
((Button) findViewById(R.id.stop_button)).setOnClickListener(this);
((Button) findViewById(R.id.reset_button)).setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch(v.getId()) {
case R.id.start_button:
if (!timer_running) {
timer_running = true;
Log.d(TAG, "clicked on Start Button");
// If the state is unknown, set it to Workout first
int State = state.getStateValue();
if (State == 0) {
state.setStateValue(1);
}
workoutTimer.start();
}
break;
case R.id.stop_button:
Log.d(TAG, "clicked on Stop Button");
if (timer_running); {
timer_running = false;
workoutTimer.cancel();
}
break;
private class WorkoutTimer extends CountDownTimer{
public WorkoutTimer(long interval) {
super(getThisTime(), interval);
Log.d(TAG, "WorkoutTimer Constructed...");
}
TextView digital_display = (TextView) findViewById(R.id.digital_display);
TextView numOfRounds = (TextView) findViewById(R.id.number_of_rounds);
public void onFinish() {
int State = state.getStateValue();
int roundsLeft = 0;
if (State == 1) {
state.setStateValue(2);
} else {
state.setStateValue(1);
}
decrementRounds();
try {
roundsLeft = Integer.parseInt(numOfRounds.getText().toString());
} catch(NumberFormatException nfe) {
roundsLeft = 999;
}
if (roundsLeft > 0 || roundsLeft != 999) {
workoutTimer.start();
}
}
public void onTick(long millisUntilFinished) {
final long minutes_left = ((millisUntilFinished/1000)/60);
final long seconds_left = (millisUntilFinished/1000) - (minutes_left * 60);
final long millis_left = millisUntilFinished % 100;
String time_left = String.format("%02d:%02d.d", minutes_left, seconds_left,
millis_left);
digital_display.setText(time_left);
}
}
private long getThisTime() {
long time = 0;
TextView workout_time = (TextView) findViewById(R.id.workout_time);
TextView rest_time = (TextView) findViewById(R.id.rest_time);
switch(state) {
case WORKOUT:
try {
time = Integer.parseInt(workout_time.getText().toString());
} catch(NumberFormatException nfe) {
time = 999;
}
// time = 90;
Log.d(TAG, "Workout time = " + time);
break;
case REST:
try {
time = Integer.parseInt(rest_time.getText().toString());
} catch(NumberFormatException nfe) {
time = 999;
}
// time = 30;
Log.d(TAG, "Rest time = " + time);
break;
case UNKNOWN:
time = 0;
break;
}
return time;
}
Все начинается нормально, но падает, когда я нажимаю любую кнопку. Если я прокомментирую свои призывы к workoutTimer, никаких сбоев. Я никогда не вижу свой логин в конструкторе класса workoutTimer, поэтому, очевидно, я что-то пропустил. Любая помощь будет оценена по достоинству.
-ian
Такой вид работы, по крайней мере, я получаю новую ошибку. Msgstr "Нет идентификатора пакета при получении значения для номера ресурса 0x000" Кажется, что в моем вызове setText. – iYeager
Ян, кажется, я ответил на вопрос, верно? Можете ли вы принять его или по крайней мере отметить его полезным? Ваша новая ошибка - это действительно другой вопрос и потребует обзора ваших файлов ресурсов. Благодарю. –
Да, вышесказанное было проблемой и инициализацией, прежде чем называть ее исправленной. – iYeager