ProgressBar с таймером обратного отсчета - Android

У меня есть 20-секундный таймер обратного отсчета, успешно работающий над моей викториной. Я хочу добавить на экран ProgressBar (а не ProgressDialog). Я нашел руководство разработчика для Android запутанным. Я погуглил множество примеров и попытался объединить их в свой код. Прямо сейчас все, что отображается, когда я запускаю игру, - это пустая полоса без «прогресса», достигнутого во время каждого вопроса игры.

QuestionView.java

public class QuestionView extends Activity  {

    int correctAnswers = 0;
    int wrongAnswers = 0;
    int answer = 0;
    int i = 0;

    long score = 0;

    long startTime = 20000;
    long interval = 1000;
    long points;

    boolean timerHasStarted = false;

    String category;

    Button answer1, answer2, answer3, answer4;
    TextView question, pointCounter, questionNumber, timeCounter;

    ArrayList<Question> queries;
    Timer cdTimer;

    ProgressBar bar;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.questionviewmain);

        answer1 = (Button)findViewById(R.id.answer1);
        answer2 = (Button)findViewById(R.id.answer2);
        answer3 = (Button)findViewById(R.id.answer3);
        answer4 = (Button)findViewById(R.id.answer4);

        question = (TextView)findViewById(R.id.question);

        category = getIntent().getStringExtra("category");
        queries = getIntent().getParcelableArrayListExtra("queries");

        pointCounter = (TextView)findViewById(R.id.timer);
        questionNumber = (TextView)findViewById(R.id.timeElapsedView);
        timeCounter = (TextView)findViewById(R.id.timeCounter);

        cdTimer = new Timer(startTime, interval);

        bar = (ProgressBar)findViewById(R.id.progressbar);
        bar.setIndeterminate(false);
        bar.setMax(9);

        loadQuestion();
    }

    public void loadQuestion() {

            bar.setProgress(i);

        if(i == 10) {

            endQuiz();

        } else {

            if(!timerHasStarted) {
                cdTimer.start();
                timerHasStarted = true;
            } else {
                cdTimer.start();
                timerHasStarted = false;
            }

            answer = queries.get(i).getCorrectAnswer();

            question.setText(queries.get(i).getQuery());

            answer1.setText(queries.get(i).getA1());
            answer2.setText(queries.get(i).getA2());
            answer3.setText(queries.get(i).getA3());
            answer4.setText(queries.get(i).getA4());

            answer1.setOnClickListener(new OnClickListener() {
                public void onClick(View arg0) {
                    queries.get(i).setSelectedAnswer(0);
                    if(answer == 0) {
                        correctAnswers++;
                        nextQuestion();
                    } else {
                        wrongAnswers++;
                        nextQuestion();
                    }
                }
            });

            answer2.setOnClickListener(new OnClickListener() {
                public void onClick(View arg0) {
                    queries.get(i).setSelectedAnswer(1);
                    if(answer == 1) {
                        correctAnswers++;
                        nextQuestion();
                    } else {
                        wrongAnswers++;
                        nextQuestion();
                    }
                }
            });

            answer3.setOnClickListener(new OnClickListener() {
                public void onClick(View arg0) {
                    queries.get(i).setSelectedAnswer(2);
                    if(answer == 2) {
                        correctAnswers++;
                        nextQuestion();
                    } else {
                        wrongAnswers++;
                        nextQuestion();
                    }
                }
            });

            answer4.setOnClickListener(new OnClickListener() {
                public void onClick(View arg0) {
                    queries.get(i).setSelectedAnswer(3);
                    if(answer == 3) {
                        correctAnswers++;
                        nextQuestion();
                    } else {
                        wrongAnswers++;
                        nextQuestion();
                    }
                }
            });
        } 
    }

    public ArrayList<Question> getQueries() {
        return queries;
    }

    public void nextQuestion() {
        score = score + points;
        i++;
        loadQuestion();
    }

    public class Timer extends CountDownTimer {

        public void startCountdownTimer() {  
        }

        public Timer(long startTime, long interval) {
            super(startTime, interval);
        }

        @Override
        public void onFinish() {
            if(i >= 9) {
                cdTimer.cancel();
                endQuiz();
            } else {
                wrongAnswers++;
                nextQuestion();
            }
        }

        @Override
        public void onTick(long millisUntilFinished) {
            timeCounter.setText("Time remaining: " + (millisUntilFinished / 100));
            points = (millisUntilFinished / 100) / 2;
            pointCounter.setText("Points remaining: " + points);
            if(i < 10) {
                questionNumber.setText("Question " + (i + 1) + " of 10");
            }
        }
    }

    public void endQuiz() {
        Intent intent = new Intent(QuestionView.this, Results.class);
        intent.putExtra("correctAnswers", correctAnswers);
        intent.putExtra("wrongAnswers", wrongAnswers);
        intent.putExtra("score", score);
        intent.putParcelableArrayListExtra("queries", queries);
        intent.putExtra("category", category);
        startActivity(intent);
    }
}

XML-код

<ProgressBar 
                android:id="@+id/progressbar"
                android:layout_height="wrap_content" 
                android:layout_width="wrap_content"
                android:visibility="visible" 
                style="@android:style/Widget.ProgressBar.Horizontal" />

person Matt    schedule 11.02.2013    source источник


Ответы (1)


Я ищу, чтобы ProgressBar медленно опускался до тех пор, пока 20 секунд, отведенных пользователю для каждого вопроса, не исчезнут.

Новый ответ
Для этого добавим новую строку в onTick():

bar.setProgress((int) Math.round(millisUntilFinished / 1000.0));

(Возможно, вам придется настроить типы данных, я далеко от своего компилятора... Также мне не нравится класс CountDownTimer, он неточен и часто пропускает предпоследнее число. Я написал здесь альтернативный класс: android CountDownTimer - дополнительная задержка в миллисекундах между тиками)


Исходный ответ
У меня есть пара советов:

  • Вы определили максимальное значение для вашего ProgressBar?

    bar.setMax(9);
    
  • Я предлагаю загрузить i в качестве прогресса вместо постоянного значения 10:

    bar.setProgress(i);
    
  • Если вы по-прежнему не видите никакого прогресса, убедитесь, что вы не находитесь в неопределенном режиме:

    bar.setIndeterminate(false);
    

    (Это предполагает, что вы используете ProgressBar, который может отображать прогресс .)


Дополнение
Переместите этот код в onCreate():

bar = (ProgressBar)findViewById(R.id.progressbar);
bar.setIndeterminate(false); // May not be necessary
bar.setMax(9);

Затем переместите эту строку в loadQuestion():

bar.setProgress(i);

В противном случае прогресс никогда не будет обновлен, поскольку вы создаете только один CountDownTimer и никогда не вызываете startCountdownTimer().

person Sam    schedule 11.02.2013
comment
Я отредактировал свой код, чтобы отразить ваши 3 пункта выше. Результат тот же. Что касается утверждения в скобках, я не знаком с этим, поэтому я не знаю ответа на этот вопрос. Возможно, мне придется изучить это в первую очередь. - person Matt; 11.02.2013
comment
Хорошо, опубликуйте свой XML-файл Progessbar. (Это линия или круг?) - person Sam; 11.02.2013
comment
Новый код дал другие результаты, но не совсем то, что я ищу. Теперь ProgressBar заполняется еще на один тик каждый раз, когда дается ответ на вопрос. Я ищу, чтобы ProgressBar медленно тикало вниз, пока 20 секунд, отведенных пользователю на каждый вопрос, не исчезнут. Если ProgressBar полностью опустеет, следующий вопрос будет загружен с новым полным ProgressBar. Прошу прощения, если я был слишком расплывчатым в своем вступительном сообщении. - person Matt; 11.02.2013
comment
У меня это работает! Я сделал все, что вы предложили, за исключением того, что я изменил bar.setProgress(i) на bar.setProgress((int) millisUntilFinished) и поместил его в метод onTick(). Спасибо Сэм! - person Matt; 12.02.2013