0

onTick()メソッドの2行でNullPointerエラーが発生しています。サブクラスの実装と、このタイマーを機能させる方法については初めてです。私はCountDownTimersをグーグルで検索し、見つけた例を実装しようとしたので、少し面倒かもしれません。

タイマーを実装する前は、アプリはうまく機能していました。私が欲しいのは、このアクティビティが開始されるとすぐにタイマーを開始し、クリックまたはタイマーが切れた後にタイマーを再起動して新しい質問を表示することです。

前もって感謝します!

public class QuestionView extends Activity  {

    int correctAnswers = 0;
    int wrongAnswers = 0;

    int answer = 0;

    int i = 0;

    long startTime = 50000;
    long interval = 1000;
    long timeElapsed;

    boolean timerHasStarted = false;

    Button answer1;
    Button answer2;
    Button answer3;
    Button answer4;
    TextView question;
    TextView timer;
    TextView timeElapsedView;

    ArrayList<Question> queries;
    Timer cdTimer;

    @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");

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

            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 int getCorrectAnswers() { return correctAnswers; }
    public int getWrongAnswers() { return wrongAnswers; }

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

    public void nextQuestion() {
        i++;
        loadQuestion();
    }

    public class Timer extends CountDownTimer {

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

        @Override
        public void onFinish() {
            timer.setText("Time's up!");
            timeElapsedView.setText("Time Elapsed: " + String.valueOf(startTime));
        }

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

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


}

LogCat

12-05 07:32:06.142: E/AndroidRuntime(6264): FATAL EXCEPTION: main
12-05 07:32:06.142: E/AndroidRuntime(6264): java.lang.NullPointerException
12-05 07:32:06.142: E/AndroidRuntime(6264):     at com.example.test.QuestionView$Timer.onTick(QuestionView.java:164)
12-05 07:32:06.142: E/AndroidRuntime(6264):     at android.os.CountDownTimer$1.handleMessage(CountDownTimer.java:124)
12-05 07:32:06.142: E/AndroidRuntime(6264):     at android.os.Handler.dispatchMessage(Handler.java:99)
12-05 07:32:06.142: E/AndroidRuntime(6264):     at android.os.Looper.loop(Looper.java:137)
12-05 07:32:06.142: E/AndroidRuntime(6264):     at android.app.ActivityThread.main(ActivityThread.java:4745)
12-05 07:32:06.142: E/AndroidRuntime(6264):     at java.lang.reflect.Method.invokeNative(Native Method)
12-05 07:32:06.142: E/AndroidRuntime(6264):     at java.lang.reflect.Method.invoke(Method.java:511)
12-05 07:32:06.142: E/AndroidRuntime(6264):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
12-05 07:32:06.142: E/AndroidRuntime(6264):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
12-05 07:32:06.142: E/AndroidRuntime(6264):     at dalvik.system.NativeStart.main(Native Method)
4

4 に答える 4

1

これだけが問題ではないかもしれませんが、初期化timerまたはtimeElapsedView.

次のようなものが必要ですonCreate()

timer = (TextView) findViewById(R.id.timer);
timeElapsedView = (TextView) findViewById(R.id.timeelapsedView);
于 2012-12-10T19:48:35.300 に答える
0

TextView を初期化する場所がわかりません

timeElapsedView = (TextView) findViewById(R.id.idOfYourTextView)

したがって、テキストを設定しようとして、テキストをfinish()設定onTick()するものが何もない場合

于 2012-12-10T19:49:25.357 に答える
0

タイマーは初期化されません。nullなので、NPEを取得します。

于 2012-12-10T19:49:35.107 に答える
0

あなたも変わるべき

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

public Timer(long startTime, long interval) {
            super(startTime, interval);
        }
于 2012-12-10T19:51:51.233 に答える