如何在Android中防止对单选按钮进行第二次点击,如果它已经被点击过了?

3

我想要阻止在 RadioGroup 中已经选中了一个 RadioButton 的情况下进行第二次点击。如果有人点击了两次,那么用户将无法更改所选的点击。我试图通过使用一个 boolean 来防止这种情况发生,但它并没有起作用。我错在哪里了?

这是我的代码:

radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(RadioGroup group, int checkedId) {
            // checkedId is the RadioButton selected
            rb = (RadioButton) findViewById(checkedId);

            user_radio_answer = (String) rb.getText();

            rb.setOnClickListener(new View.OnClickListener() {

                private boolean isChecked = true;
                @Override
                public void onClick(View v) {

                    if (isChecked) {
                        if (rb.isChecked() ) {

                            isChecked = false;
                        }
                    }
                    if (correct_answer1.equals(user_radio_answer)) {
                        rb.setBackgroundColor(Color.GREEN);
                        //  Toast.makeText(getApplicationContext(), "Correct ☺ : " + user_radio_answer, Toast.LENGTH_LONG).show();
                    } else {
                        Toast.makeText(getApplicationContext(), "Incorrect Answer :( ..Correct Answer :  " + correct_answer1, Toast.LENGTH_LONG).show();
                        rb.setBackgroundColor(Color.parseColor("#FF5733"));
                        answer1 = rb_answer1.getText().toString();
                        answer2 = rb_answer2.getText().toString();
                        answer3 = rb_answer3.getText().toString();
                        answer4 = rb_answer4.getText().toString();

                        if (answer1.equals(correct_answer1)) {
                            rb_answer1.setBackgroundColor(Color.GREEN);
                        }
                        if (answer2.equals(correct_answer1)) {
                            rb_answer2.setBackgroundColor(Color.GREEN);
                        }
                        if (answer3.equals(correct_answer1)) {
                            rb_answer3.setBackgroundColor(Color.GREEN);
                        }
                        if (answer4.equals(correct_answer1)) {
                            rb_answer4.setBackgroundColor(Color.GREEN);
                        }


                    }

                    new RadioHttpAsyncTask().execute("http:xxxxxx-xxxxxxxxxx-xxxxxxxx");
                }
            });
        }
    });

你可以禁用按钮,但这也会影响用户界面。你也可以保留一个标志,在实际执行方法中设置/检查它,以确定是否要执行代码。 - Stultuske
使用整数变量,例如计数器,减少其值,增加它的值,并将其清空。 - Quick learner
可能的问题在于您正在onCheckedChanged中设置OnClickListener。这意味着在任何选项更改后,您当前的“RadioButton”将清除先前在其isChecked字段中保存的所有信息。尝试在onCheckedChanged方法之外设置它。 - Ircover
好的,谢谢您的建议 :) - Mahak Singhvi
4个回答

2

只需记住他们是否回答了问题,以及生成第一个答案的视图(RadioButton),并在每次单击RadioButton时再次检查该RadioButton。这假定RadioGroup中的所有RadioButton都具有相同的onClick方法。

boolean answered = false;
RadioButton radioAnswer;
public void answer1(View view) {
    if (!answered) {
        radioAnswer = (RadioButton) view;
        answered = true;
    } else {
        radioAnswer.setChecked(true);
    }
}

0

您可以在单击后禁用它,以停止监听单击事件

rb.setEnabled(false);

编辑:

或者,一旦单击后,您可以删除单击监听器。

rb.setOnClickListener(null);

我不想启用它,只想阻止在同一组中的任何单选按钮第二次点击,如果它已经被点击过一次。 - Mahak Singhvi

0

您可以添加两个方法,然后在需要时调用它们。您可以添加一个条件,如果单选按钮被选中,则禁用该组,如果未选中,则将其设置为启用状态。当您清除单选组时,还可以设置按钮为启用状态。

public void disableRG() {
    for(int i = 0; i < radioGroup.getChildCount(); i++){
        ((RadioButton)radioGroup.getChildAt(i)).setEnabled(false);
    }
}

 public void enableRG() {
        for(int i = 0; i < radioGroup.getChildCount(); i++){
            ((RadioButton)radioGroup.getChildAt(i)).setEnabled(true);
        }
    }

它将防止第二次点击。 - Rainmaker
它完全按照要求工作!感谢您的建议,先生 :) - Mahak Singhvi

0
也许你可以设置一个全局布尔标志。
  `private boolean alreadyChecked = false;
   radioGroup.setOnCheckedChangeListener(new    
   RadioGroup.OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(RadioGroup group, int checkedId) {
        // checkedId is the RadioButton selected
        rb = (RadioButton) findViewById(checkedId);

        user_radio_answer = (String) rb.getText();

        if (!alreadyChecked) {

          rb.setOnClickListener(new View.OnClickListener() {

              private boolean isChecked = true;
              @Override
              public void onClick(View v) {

                  if (isChecked) {
                      if (rb.isChecked() ) {

                          isChecked = false;
                      }
                  }
                  if (correct_answer1.equals(user_radio_answer)) {
                      rb.setBackgroundColor(Color.GREEN);
                      //  Toast.makeText(getApplicationContext(), "Correct ☺ : " + user_radio_answer, Toast.LENGTH_LONG).show();
                  } else {
                      Toast.makeText(getApplicationContext(), "Incorrect Answer :( ..Correct Answer :  " + correct_answer1, Toast.LENGTH_LONG).show();
                      rb.setBackgroundColor(Color.parseColor("#FF5733"));
                      answer1 = rb_answer1.getText().toString();
                      answer2 = rb_answer2.getText().toString();
                      answer3 = rb_answer3.getText().toString();
                      answer4 = rb_answer4.getText().toString();

                      if (answer1.equals(correct_answer1)) {
                          rb_answer1.setBackgroundColor(Color.GREEN);
                      }
                      if (answer2.equals(correct_answer1)) {
                          rb_answer2.setBackgroundColor(Color.GREEN);
                      }
                      if (answer3.equals(correct_answer1)) {
                          rb_answer3.setBackgroundColor(Color.GREEN);
                      }
                      if (answer4.equals(correct_answer1)) {
                          rb_answer4.setBackgroundColor(Color.GREEN);
                      }


                  }

                  new RadioHttpAsyncTask().execute("http:xxxxxx-xxxxxxxxxx-xxxxxxxx");
              }
              alreadyChecked = true;
          });
         }
    }
});`

谢谢!Matthias Neubert。它已经解决了我50%的问题,但不是全部问题。仍然,单选按钮处于点击模式,我想停止它。 - Mahak Singhvi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接