2013-09-11 4 views
0

Я пытаюсь реализовать 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

ответ

0

Вы не инициализирован свой workoutTimer. Вам нужно добавить следующую строку в свой метод onCreate.

workoutTimer = new WorkoutTimer(...); 
+0

Такой вид работы, по крайней мере, я получаю новую ошибку. Msgstr "Нет идентификатора пакета при получении значения для номера ресурса 0x000" Кажется, что в моем вызове setText. – iYeager

+0

Ян, кажется, я ответил на вопрос, верно? Можете ли вы принять его или по крайней мере отметить его полезным? Ваша новая ошибка - это действительно другой вопрос и потребует обзора ваших файлов ресурсов. Благодарю. –

+0

Да, вышесказанное было проблемой и инициализацией, прежде чем называть ее исправленной. – iYeager