【问题标题】:Android: onClickListener does not work as programmedAndroid:onClickListener 无法按编程方式工作
【发布时间】:2013-09-10 02:21:48
【问题描述】:

安卓测试: 我正在设置一个 onClickListener 来监视按下了哪个答案按钮,并且我正在尝试从表格中访问正确的答案以检查是否给出了分数。 问题是问题没有改变(在这种情况下是数字)。

//variables ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
private TextView questionBox;
private Button startButton, answerButton1, answerButton2, answerButton3, answerButton4;
private RadioGroup radioGroup1;
private RadioButton difficulty_easy_radio, difficulty_medium_radio, difficulty_hard_radio;
private String difficulty = "easy";
private int score = 0;
int pointer = 0;
public String correct; // QuestionTables.questionTable[pointer].getCorrectAnswer();
//variables ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

startButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            if(v.getId() == startButton.getId())
            {
                //setting the elements of the layout
                setContentView(R.layout.activity_playing);
                final View controlsView = findViewById(R.id.fullscreen_content_controls2);
                final View contentView = findViewById(R.id.fullscreen_content2);

                //connecting layout elements with variables
                questionBox = (TextView) findViewById(R.id.question_box);
                answerButton1 = (Button) findViewById(R.id.answer_button1);
                answerButton2 = (Button) findViewById(R.id.answer_button2);
                answerButton3 = (Button) findViewById(R.id.answer_button3);
                answerButton4 = (Button) findViewById(R.id.answer_button4);

                //changing questions *****"pointer" and "correct" are declared globally to avoid:
                //Cannot refer to a non-final variable inside an inner class defined in a different method ERROR*****
                // don't forget to i++ as i<QuestionTables.questionTable.length=10

                //set first question
                QuestionTables.shuffleAnswers(pointer);
                questionBox.setText(""+pointer);
                answerButton1.setText(QuestionTables.questionAnswers[0]);
                answerButton2.setText(QuestionTables.questionAnswers[1]);
                answerButton3.setText(QuestionTables.questionAnswers[2]);
                answerButton4.setText(QuestionTables.questionAnswers[3]);
                correct = QuestionTables.questionTable[pointer].getCorrectAnswer();

                //button listener
                controlsView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        // TODO Auto-generated method stub
                        switch(v.getId())
                        {
                            case R.id.answer_button1:
                            {
                                //check if correct
                                correct = QuestionTables.questionTable[pointer].getCorrectAnswer();
                                int clickedId = v.getId();
                                Button clickedButton = (Button) findViewById(clickedId);
                                if(clickedButton.getText().equals(correct))
                                    score+=100;
                                pointer++;

                                //change question
                                QuestionTables.shuffleAnswers(pointer);
                                questionBox.setText(""+pointer);
                                answerButton1.setText(QuestionTables.questionAnswers[0]);
                                answerButton2.setText(QuestionTables.questionAnswers[1]);
                                answerButton3.setText(QuestionTables.questionAnswers[2]);
                                answerButton4.setText(QuestionTables.questionAnswers[3]);

                                break;
                            }

                            case R.id.answer_button2:
                            {
                                //check if correct
                                correct = QuestionTables.questionTable[pointer].getCorrectAnswer();
                                int clickedId = v.getId();
                                Button clickedButton = (Button) findViewById(clickedId);
                                if(clickedButton.getText().equals(correct))
                                    score+=100;
                                pointer++;

                                //change question
                                QuestionTables.shuffleAnswers(pointer);
                                questionBox.setText(""+pointer);
                                answerButton1.setText(QuestionTables.questionAnswers[0]);
                                answerButton2.setText(QuestionTables.questionAnswers[1]);
                                answerButton3.setText(QuestionTables.questionAnswers[2]);
                                answerButton4.setText(QuestionTables.questionAnswers[3]);

                                break;
                            }

                            case R.id.answer_button3:
                            {
                                //check if correct
                                correct = QuestionTables.questionTable[pointer].getCorrectAnswer();
                                int clickedId = v.getId();
                                Button clickedButton = (Button) findViewById(clickedId);
                                if(clickedButton.getText().equals(correct))
                                    score+=100;
                                pointer++;

                                //change question
                                QuestionTables.shuffleAnswers(pointer);
                                questionBox.setText(""+pointer);
                                answerButton1.setText(QuestionTables.questionAnswers[0]);
                                answerButton2.setText(QuestionTables.questionAnswers[1]);
                                answerButton3.setText(QuestionTables.questionAnswers[2]);
                                answerButton4.setText(QuestionTables.questionAnswers[3]);

                                break;
                            }

                            case R.id.answer_button4:
                            {
                                //check if correct
                                correct = QuestionTables.questionTable[pointer].getCorrectAnswer();
                                int clickedId = v.getId();
                                Button clickedButton = (Button) findViewById(clickedId);
                                if(clickedButton.getText().equals(correct))
                                    score+=100;
                                pointer++;

                                //change question
                                QuestionTables.shuffleAnswers(pointer);
                                questionBox.setText(""+pointer);
                                answerButton1.setText(QuestionTables.questionAnswers[0]);
                                answerButton2.setText(QuestionTables.questionAnswers[1]);
                                answerButton3.setText(QuestionTables.questionAnswers[2]);
                                answerButton4.setText(QuestionTables.questionAnswers[3]);

                                break;
                            }
                        }
                    }
                });
            }       
        }
    });

请注意,startButton 位于 Activity 的第一个布局中,当按下时,此布局将出现在下一个布局中。

【问题讨论】:

  • controlsview 到底是什么?

标签: android onclicklistener


【解决方案1】:

你有很多代码,但我假设这是问题所在:

controlsView.setOnClickListener(new View.OnClickListener() {

你给controlsView 一个私有的OnClickListener 然后期望它处理来自所有按钮的点击事件。这会失败,因为其他按钮没有使用这个OnClickListener

创建一个共享监听器。

View.OnClickListener listener = new View.OnClickListener() {//..

然后将其传递给其余的按钮。

answerButton1.setOnClickListener (listener);
answerButton2.setOnClickListener (listener);
//etc

你也可以让Activity实现OnClickListener接口。

public class MyActivity extends Activity implements OnClickListener{

@Override
public void onClick (View v)
{
 //implementation
}

然后要设置OnClickListener,您需要传递Activity 实例。

answerButton1.setOnClickListener (MyActivity.this);

【讨论】:

  • 或者更好的是,通过实现该接口将 Activity 转换为 OnClickListener,然后将每个按钮的 onClickListener 设置为 this
  • 成功了!感谢您的帮助。实际上,我试图通过将侦听器分配给我认为会成功包含所有“控件”按钮等的控件视图来共享侦听器。
猜你喜欢
  • 1970-01-01
  • 2016-07-09
  • 2021-06-01
  • 2011-04-21
  • 2017-08-16
  • 2020-09-04
  • 2015-03-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多