0

プログラムが動作し、起動します。メインメニューの[スタート]をクリックすると、質問(テキストビュー)と4つの回答(ボタン)が表示されます。テキストは、テキストビューとforループのある4つのボタンに割り当てられます。ボタンをクリックした後、ループすることはありません。ボタンをクリックしても何も起こりません。

「ブレーク」を入れてwhileループに変更しようとしましたが、機能しません。これは私が見つけることができない単純な修正だと思います。

他のコード構造やアドバイスは高く評価され、必要です!

public class QuestionView extends Activity {

    Quiz quiz = new Quiz();
    ArrayList<Question> queries = quiz.getRandom10();

    int correctAnswers = 0;
    int wrongAnswers = 0;

    int answer = 0;

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

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

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

        for(int i = 0; i < 10; i++) {
            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());

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

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

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

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

            answer4.setOnClickListener(new OnClickListener() {
                public void onClick(View arg0) {
                    if(answer == 3) {
                        correctAnswers++;
                    } else {
                        wrongAnswers++;
                    }
                }
            });
        }
    }
}
4

2 に答える 2

1

onCreateメソッドは、アクティビティが作成されたときにのみ実行されます。次のコードを別のメソッドに分割し、さまざまなボタンに対してonClickLiestener()からそのメソッドを呼び出します。

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

このソリューションにはループが含まれないため、クリックするたびにインデックス(この場合は「i」)が増加することを確認する必要があります。

編集: 提案された解決策

public class QuestionView extends Activity {

    Quiz quiz = new Quiz();
    ArrayList<Question> queries = quiz.getRandom10();

    int correctAnswers = 0;
    int wrongAnswers = 0;

    int answer = 0;

    int i=0;

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

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

        answer1.setOnClickListener(new OnClickListener() {
            public void onClick(View arg0) {
                if(answer == 0) {
                    correctAnswers++;
                } else {
                    wrongAnswers++;
                }
                reloadQuestion();
            }
        });

        answer2.setOnClickListener(new OnClickListener() {
            public void onClick(View arg0) {
                if(answer == 1) {
                    correctAnswers++;
                } else {
                    wrongAnswers++;
                }
                reloadQuestion();
            }
        });

        answer3.setOnClickListener(new OnClickListener() {
            public void onClick(View arg0) {
                if(answer == 2) {
                    correctAnswers++;
                } else {
                    wrongAnswers++;
                }
                reloadQuestion();
            }
        });

        answer4.setOnClickListener(new OnClickListener() {
            public void onClick(View arg0) {
                if(answer == 3) {
                    correctAnswers++;
                } else {
                    wrongAnswers++;
                }
                reloadQuestion();
            }
        });

        reloadQuestion();
    }


    private void reloadQuestion(){
        TextView question = (TextView)findViewById(R.id.question);

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

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

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

        i++;
    }
}

おそらくさまざまな方法でコードを最適化できますが、この提案で問題が解決するはずです。

于 2012-12-03T01:26:38.947 に答える
1

プログラムが行うことは、「クエリ」ArrayListから一連のTextViewオブジェクトに異なるテキストを10回割り当てることです。また、同じonClickListenerオブジェクトを同じtextViewオブジェクトに何度も割り当てます。そして、それはすべて、アクティビティが作成されたときに発生します。したがって、実際にアクティビティを確認できるようになった時点で、ループは終了し、すべてのtextViewアイテムに最後(10番目)の値があります。ボタンをクリックすると、プログラムは要求されたとおりに実行します。つまり、カウンターの1つを増やします。

これはあなたが考えていることではないと思います。そして、あなたが本当にやりたいことは次のとおりです。

  1. onClickListenerオブジェクトを1つだけ作成し、onCreate()メソッドですべてのtextViewアイテムに割り当てます。
  2. onClickListener内で、クリックされたビューを確認し(どのtextVIewがクリックされたかを判別します)、それを正解と比較します。それに応じてカウンターを更新します。次の一連の質問と回答のデータを読み、UIを更新します。

これが私が話していることの例です:

public class QuestionView extends Activity {

    Quiz quiz = new Quiz();
    ArrayList<Question> queries = quiz.getRandom10();

    private int correctAnswers;
    private int wrongAnswers;
    private char mCurrentAnswer;
    private char mNextQuestion;

    private View.OnClickListener clickListener = new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            if (v.getId() == getCurrentAnswer()) {
                ++correctAnswers;
            } else {
                ++wrongAnswers;
            }

            readNextQuestion();
        }
    }; 

    private int getCurrentAnswer() {
        return mCurrentAnswer;
    }

    private void readNextQuestion() {
        question.setText(queries.get(mNextQuestion).getQuery());
        answer1.setText(queries.get(mNextQuestion).getA1());
        answer2.setText(queries.get(mNextQuestion).getA2());
        answer3.setText(queries.get(mNextQuestion).getA3());
        answer4.setText(queries.get(mNextQuestion).getA4());

        mCurrentAnswer = queries.get(mNextQuestion).getCorrectAnswer();

        ++mNextQuestion;
    }

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

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

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

        //You can also assign it in the xml (I guess)
        answer1.setId(1);
        answer1.setOnClickListener(clickListener);
        answer2.setId(2);
        answer2.setOnClickListener(clickListener);
        answer3.setId(3);
        answer3.setOnClickListener(clickListener);
        answer4.setId(4);
        answer4.setOnClickListener(clickListener);

        readNextQuestion();
    }
}
于 2012-12-03T01:53:24.997 に答える