Android的RadioGroup的onCheckedChanged方法

32

我正在编写一个Android的Activity,其中我在RadioGroup下面有两个单选按钮。其中一个默认被选中。但是我无法在onCreate方法中触发事件,以便我可以在其中执行一些操作。当点击时,onCheckedChanged运行良好。

RadioGroup ItemtypeGroup = (RadioGroup) findViewById(R.id.rechargeItemtype);
    RadioButton providerRadio = (RadioButton) findViewById(R.id.a);
    providerRadio.performClick();

    ItemtypeGroup.setOnCheckedChangeListener(new OnCheckedChangeListener() {

        @Override
        public void onCheckedChanged (RadioGroup group,int checkedId){

            Log.d("chk", "id" + checkedId);

            if (checkedId == R.id.a) {
                //some code
            } else if (checkedId == R.id.b) {
                //some code
            }
        }
    });

尝试在设置监听器后放置您的 performClick() 代码。 - codeMagic
谢谢您的评论,但是没有运气 :( - user2534310
你在listener里面放了断点来确保它没有进入,而且里面没有其他东西搞砸它吗? - codeMagic
当我点击单选按钮时,可以在Logcat中看到效果。 - user2534310
6个回答

48

在初始化时触发一个默认的单选框。使用clearCheck方法将所有内容设置为未选中,然后设置处理程序,接着设置默认值,你的处理程序就会被触发。

itemtypeGroup.clearCheck();

然后像平常一样添加一个监听器...

itemtypeGroup
        .setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
Log.d("chk", "id" + checkedId);

                if (checkedId == R.id.a) {
                    //some code
                } else if (checkedId == R.id.b) {
                    //some code
                }

            }

        });

然后选中默认的单选按钮,您的监听器将会触发。

rb = (RadioButton) view.findViewById(R.id.a);
rb.setChecked(true);

祝你好运


这个语句 "rb = (RadioButton) view.findViewById(R.id.a);" 是什么意思?我们需要在 onCheckedChanged 内部声明吗? - Karan Thakkar
三个步骤。清除所有内容,连接处理程序,设置默认值。因为在连接侦听器代码之后设置默认值,所以侦听器代码将运行。 - danny117
非常抱歉给你点了个踩 - 那是无意中的。我试图通过点击赞成来更正它,但我无法做到。如果您知道更正踩的方法,请告诉我。 - stevehs17
NP 不用担心。 - danny117
假设我有三个单选按钮组,那么我该如何处理它们的监听器? - Jorvis
1
@Jorvis 对于三个组+,我可能会在checkedID上使用switch语句。计划所有的checkedIds在APP中都是唯一的。我可能会根据应用程序使用不同的处理程序。 - danny117

10
 radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(RadioGroup group, int checkedId) {

            if (checkedId == R.id.radioButton1) {
             //do work when radioButton1 is active
            } else  if (checkedId == R.id.radioButton2) {
             //do work when radioButton2 is active
          } else  if (checkedId == R.id.radioButton3) {
             //do work when radioButton3 is active
          }

        }
    });

这对我很有帮助。希望它能帮到你。


假设我有三个单选按钮组,那么我该如何处理它们的监听器? - Jorvis
那么你的意思是我应该为三个单选按钮组实现三个不同的监听器,以及三个onCheckedChanged方法。 - Jorvis
不可以。你必须使用一个监听器并在监听器中检查哪个被选中。 - Maysam R

6

尝试这段代码。

在你的onCreate方法中声明这段代码。

    RadioGroup radioGroup = (RadioGroup) findViewById(R.id.radiogroup);
    radioGroup.clearCheck();
    radioGroup.setOnCheckedChangeListener(new  RadioGroup.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(RadioGroup group, int checkedId) {

            RadioButton rb = (RadioButton) group.findViewById(checkedId);
            if (null != rb && checkedId > -1) {

                // checkedId is the RadioButton selected
                switch (checkedId) {
                    case R.id.one:
                     // Do Something
                      break;

                    case R.id.two:
                    // Do Something
                      break;   

                    case R.id.three:
                    // Do Something   
                        break;
                }
            }
        }

    });

希望这可以帮到您。

3
问题在于,你在调用providerRadio.performClick();方法之后才为RadioGroup设置了OnCheckedChangeListener。因此,在执行providerRadio.performClick();方法之前,没有可以调用的OnCheckedChangeListener。因此,为了使其正常工作,你需要在调用performClick()方法之前设置监听器。

并且,你应该使用RadioGroup.check()方法来更改当前选中的RadioButton,而不是使用RadioButton.performClick()

因此,你可以使用以下代码来更改RadioGroup的当前选择:

RadioGroup ItemtypeGroup = (RadioGroup) findViewById(R.id.rechargeItemtype);
ItemtypeGroup
        .setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
                Log.d("chk", "id" + checkedId);

                if (checkedId == R.id.a) {
                    //some code
                } else if (checkedId == R.id.b) {
                    //some code
                }

            }

        });
ItemtypeGroup.check(R.id.a);

注意:在添加OnCheckedChangeListener之后,请确保调用RadioGroup.check()方法,如上述代码片段中所示。


0
我猜你在设置监听器之前进行了点击,这就是为什么事件没有触发的原因。

0

即使@dannys answer可以,但我希望将默认值XML布局定义文件中获取,而不是在代码中设置。

这就是为什么我使用以下方法:

  1. 存储单选组的默认值
  2. 清除所有选项
  3. 初始化OnCheckedChangeListener
  4. 再次检查默认值(先前存储的),触发监听器

在代码中,这可能看起来像这样,其中first_radio_button默认单选按钮:

// call this in any init method
_myRadioGroup    = _myViewContainingTheRadioGroup.findViewById(R.id.my_radio_group);
int defaultValue = _myRadioGroup.getCheckedRadioButtonId();
_myRadioGroup.clearCheck();
_myRadioGroup.setOnCheckedChangeListener(_myRadioGroupCheckedChangeListener);
_myRadioGroup.check(defaultValue);

在你的类中的某个地方放置OnCheckedChangeListener

private RadioGroup.OnCheckedChangeListener _myRadioGroupCheckedChangeListener = new RadioGroup.OnCheckedChangeListener()
{
  @Override
  public void onCheckedChanged(RadioGroup group, int checkedId)
  {
    switch(group.findViewById(checkedId).getId())
    {
      case R.id.first_radio_button:
        // do stuff
        break;
      case R.id.second_radio_button:
        // do stuff
        break;
      // ...
    }
  }
};

这是我的单选按钮组 XML

  <RadioGroup
    android:id="@+id/my_radio_group"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <RadioButton
      android:id="@+id/first_radio_button"
      android:layout_width="wrap_content"
      android:layout_height="match_parent"
      android:checked="true"
      android:text="@string/first_radio_button_text"/>

    <RadioButton
      android:id="@+id/second_radio_button"
      android:layout_width="wrap_content"
      android:layout_height="match_parent"
      android:text="@string/second_radio_button_text"/>

    // ...

  </RadioGroup>

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