0

The program works and comes up. When I click start on the main menu it brings up a question (textview) and 4 answers (buttons). Text is assigned to the textview and the 4 buttons with the for-loop. It is never looping through after clicking a button. Nothing happens when clicking a button.

I have tried putting in a "break" and changing to a while loop and just can't get it working. I think this is a simple fix that I just cannot find.

Any other code structure or advice is appreciated and needed!

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 方法仅在创建 Activity 时运行。您要做的是将以下代码分解为一个单独的方法,并从 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 对象十次。它还一遍又一遍地将相同的 onClickListener 对象分配给相同的 textView 对象。这一切都发生在创建活动时。因此,当您真正能够看到您的活动时,循环结束并且所有 textView 项目都具有最后(第 10 个)值。当您单击该按钮时,程序会完全按照您的要求执行:增加一个计数器。

我相信这不是你的想法。而你真正想做的是:

  1. 只创建一个 onClickListener 对象并在 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 回答