CountDownTimer мелочи игровой счет - Android (Java)

У меня есть игра пустяков, которая отображает 10 вопросов, и у каждого из них есть таймер на 10 секунд. У меня есть 2 проблемы, которые не работают правильно.

Во-первых, если таймер заканчивается на вопросе, он отображает следующий вопрос, но таймер не сбрасывается. Текстовые представления остаются в "Время истекло!" и "Время истекло: 10000" вместо перезапуска таймера для нового отображаемого вопроса.

Наконец, на странице "Результаты" правильный текст не отображается в текстовом представлении. Текстовое представление в процентах отображается правильно, но текстовое представление счета отображает "android.widget.TextView@416473c" или другое произвольное расположение в памяти.

Программа никогда не падает, только неправильно функционирует. Любая структура кода или другие предложения приветствуются! Это моя первая попытка мобильного приложения для Android, и я медленно и тяжело переживаю это. Пока наслаждаюсь этим!:)

QuesteionView.java

public class QuestionView extends Activity  {

    @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);
        queries = getIntent().getParcelableArrayListExtra("queries");
        timer = (TextView)findViewById(R.id.timer);
        timeElapsedView = (TextView)findViewById(R.id.timeElapsedView);
        cdTimer = new Timer(startTime, interval);
        loadQuestion();
    }

    public void loadQuestion() {

        if(i == 9) {    
            endQuiz();  
        } else {    
            if(!timerHasStarted) {
                cdTimer.start();
                timerHasStarted = true;
            } else {
                cdTimer.cancel();
                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();
                    }
                }
            });

           //same type of code for buttons for answers 2 through 4.
                } 
    }

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

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

        public void onFinish() {
            if(i == 9) {
                cdTimer.cancel();
            } else {
                timer.setText("Time's up!");
                timeElapsedView.setText("Time Elapsed: " + String.valueOf(startTime));
                wrongAnswers++;
                nextQuestion();
            }
        }

        public void onTick(long millisUntilFinished) {
            timer.setText("Time remain: " + Long.toString(millisUntilFinished));
            timeElapsed = startTime - millisUntilFinished;
            timeElapsedView.setText("Time Elapsed: " + Long.toString(timeElapsed));
        }
    }

    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);
        startActivity(intent);
    }
}

Results.java

    public class Results extends Activity {

    QuestionView qv = new QuestionView();
    ArrayList<Question> queryList = qv.getQueries();

    int cAnswers;
    int wAnswers;

    long score;

    ArrayList<Question> qs;

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

        cAnswers = getIntent().getIntExtra("correctAnswers", -1);
        wAnswers = getIntent().getIntExtra("wrongAnswers", -1);
        score = getIntent().getLongExtra("score", -1);

        qs = getIntent().getParcelableArrayListExtra("queries");

        Button mainmenuBtn = (Button)findViewById(R.id.mainmenuBtn);
        mainmenuBtn.setText("Main Menu");

        mainmenuBtn.setOnClickListener(new OnClickListener() {
            public void onClick(View arg0) {
                restart();
            }
        });

        showResults();
    }

    public void showResults() {

        ArrayList<TextView> tList = new ArrayList<TextView>(9);

        TextView header = (TextView)findViewById(R.id.header);
        header.setText("SUMMARY");

        TextView percentage = (TextView)findViewById(R.id.percentage);
        percentage.setText(Integer.toString(10 * cAnswers) + "%");

        TextView score = (TextView)findViewById(R.id.score);
        String s = "" + score;
        score.setText(s);

        TextView q1 = (TextView)findViewById(R.id.q1);
        TextView q2 = (TextView)findViewById(R.id.q2);
        TextView q3 = (TextView)findViewById(R.id.q3);
        TextView q4 = (TextView)findViewById(R.id.q4);
        TextView q5 = (TextView)findViewById(R.id.q5);
        TextView q6 = (TextView)findViewById(R.id.q6);
        TextView q7 = (TextView)findViewById(R.id.q7);
        TextView q8 = (TextView)findViewById(R.id.q8);
        TextView q9 = (TextView)findViewById(R.id.q9);
        TextView q10 = (TextView)findViewById(R.id.q10);

        tList.add(q1);
        tList.add(q2);
        tList.add(q3);
        tList.add(q4);
        tList.add(q5);
        tList.add(q6);
        tList.add(q7);
        tList.add(q8);
        tList.add(q9);
        tList.add(q10);

        for(int i = 0; i < tList.size(); i++) {
            tList.get(i).setText(qs.get(i).getQuery());
            if(qs.get(i).getSelectedAnswer() == qs.get(i).getCorrectAnswer()) {
                tList.get(i).setTextColor(Color.GREEN);
            } else {
                tList.get(i).setTextColor(Color.RED);
            }
        }
    }

    public void restart() {
        Intent intent = new Intent(Results.this, MainMenu.class);
        startActivity(intent);
    }
}

2 ответа

Решение

Из всего этого кода, это то, что я думаю, происходит

Во-первых, если таймер заканчивается на вопросе, он отображает следующий вопрос, но таймер не сбрасывается. Текстовые представления остаются в "Время истекло!" и "Время истекло: 10000" вместо перезапуска таймера для нового отображаемого вопроса.

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

Наконец, на странице "Результаты" правильный текст не отображается в текстовом представлении. Текстовое представление в процентах отображается правильно, но текстовое представление счета отображает "android.widget.TextView@416473c" или другое произвольное расположение в памяти.

Это потому, что вы устанавливаете переменные q для textview и получаете идентификатор. Вам нужно что-то вроде q1.getText().toString()

У вас есть несколько переменных с одним и тем же именем. Так что измени его

  TextView score2 = (TextView)findViewById(R.id.score);
  String s = "" + score;
  score2.setText(s);

Оценка показывает не то, что вы ожидали, потому что вы присвоили String s = "" + score где score это то, что вы назвали для Textview который, очевидно, не является целым числом и не эквивалентен баллу, который имеет пользователь.:)

Другие вопросы по тегам