【问题标题】:android onCheckedChanged for radiogroupandroid onCheckedChanged 用于无线电组
【发布时间】:2013-09-03 09:03:22
【问题描述】:

我在 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
            }
        }
    });

【问题讨论】:

  • 在设置listener 后尝试输入performClick() 代码
  • 感谢您的评论,但没有运气:(
  • 嗯...你在listener 中设置了一个断点,以确保它不会去那里并且里面的其他东西不会搞砸吗?
  • 已编辑。当我点击收音机时,我可以在 logcat 中看到效果。

标签: android radio-button radio-group


【解决方案1】:

在初始化时触发默认的单选复选框。使用 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 内部声明吗?
  • 三个步骤。清除所有,连接处理程序,设置默认值。因为默认值是在监听器连接后设置的,所以监听器代码将运行。
  • 我很抱歉投了反对票 - 这是无意的。我试图通过单击 upvote 来纠正它,但我做不到。如果您知道纠正反对票的方法,请告诉我。
  • NP不用担心。
  • @Jorvis 对于三个组+,我可能会在 checkID 上使用 switch 语句。计划所有checkedIds在APP中都是唯一的。我想我可能会使用单独的处理程序取决于应用程序。
【解决方案2】:
 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
          }

        }
    });

这对我有用。希望有帮助

【讨论】:

  • 假设我有三个广播组,那么我将如何处理其中三个的听众?
  • 所以你的意思是我应该为三个广播组实现三个不同的侦听器以及三个 onCheckedChanged 方法。
  • 没有。您必须使用一个侦听器并检查在侦听器中选择了哪一个。
【解决方案3】:

试试这个代码。

在您的 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;
                }
            }
        }

    });

希望这会有所帮助。

【讨论】:

    【解决方案4】:

    问题是因为,你在设置 OnCheckedChangeListener on RadioGroup providerRadio.performClick(); 方法调用之后.

    这就是为什么当providerRadio.performClick(); 方法执行到那时他们没有OnCheckedChangeListener 可供调用。因此,要使其正常工作,您需要在调用 performClick() 方法之前设置 Listener。

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

    因此您可以使用此代码更改 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);
    

    注意:- 确保调用 RadioGroup.check() 方法后添加 OnCheckedChangeListener 如上代码sn-p中。

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        尽管@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>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-04-25
          • 1970-01-01
          • 1970-01-01
          • 2013-06-07
          • 1970-01-01
          • 1970-01-01
          • 2023-04-06
          • 2012-03-16
          相关资源
          最近更新 更多