android onCheckedChanged for radiogroup
Asked Answered
G

6

32

I'm writing an Activity in android where I have two radio buttons under a RadioGroup. One of them is checked by default. But I can't trigger the event in onCreate method so that I can do something in that. The onCheckedChanged is running fine when clicked on.

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
            }
        }
    });
Glomerate answered 30/8, 2013 at 15:9 Comment(4)
Try putting your performClick() code after you set the listenerReady
Thanks for the comment but no luck :(Glomerate
Hmmm...have you put a breakpoint inside your listener to be sure that it isn't going there and something else inside it isn't screwing it up?Ready
edited. When i click on the radio i can see the effect in the logcat.Glomerate
N
48

To fire a radio check box for the default when initializing. Set everything to unchecked with the clearCheck method, then set the handler, then set the default and your handler will fire.

itemtypeGroup.clearCheck();

then same as usual add a listener...

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
                }

            }

        });

Then check the default radio button and your listener will fire.

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

Good Luck

Negrito answered 30/8, 2013 at 16:53 Comment(6)
What does this "rb = (RadioButton) view.findViewById(R.id.a);" mean? Do we have to declare inside onCheckedChanged?Cocoa
Three steps. Clear all, wire up handler, set default. Because the default is set after the listener is wired up the listener code will run.Negrito
I am sorry for the downvote - it was inadvertent. I tried to correct it by clicking upvote, but I could not. If you know of a way to correct the downvote, please let me know.Cohabit
NP don't worry about it.Negrito
Suppose I have three radio groups, then how would I handle the listener for three of them?Trike
@Trike For three groups+ I might use a switch statement on checkedID. Plan all of the checkedIds are unique in the APP. I might use separate handlers depends on app I suppose.Negrito
K
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
          }

        }
    });

this work for me . hope is helpfull

Kephart answered 23/1, 2016 at 21:30 Comment(3)
Suppose I have three radio groups, then how would I handle the listener for three of them?Trike
So you mean I should implement three different listeners along with three onCheckedChanged methods for three radio groups.Trike
no. you must be use one Listener and check which one selected in listener.Kephart
G
6

Try this Code.

Declare this code in your onCreate method.

    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;
                }
            }
        }

    });

Hope this helps.

Galingale answered 21/2, 2017 at 11:18 Comment(0)
M
3

The problem is because, you are setting OnCheckedChangeListener on RadioGroup after the providerRadio.performClick(); method call.

That's why when providerRadio.performClick(); method executes till then their is no OnCheckedChangeListener available to call. So, to make it work, you need to set Listener before the call to performClick() method.

And instead of using RadioButton.performClick() you should use RadioGroup.check() method to change the current checked RadioButton.

So you can use this code to change current selection of 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);

Note:- Make sure to call RadioGroup.check() method after adding OnCheckedChangeListener as above in code snippet.

Metrology answered 7/10, 2016 at 8:34 Comment(0)
T
0

I guess you are performing click before setting listener to the group, that's why event is not triggered.

Toms answered 12/11, 2016 at 7:23 Comment(0)
L
0

Even though @dannys answer is ok I would like to have the default value taken from the XML layout definition file rather then setting it in code.

That's why I use this approach to:

  1. store the default value form the radio group
  2. clear all check's
  3. initialize the OnCheckedChangeListener
  4. check the default again (which was stored previously) which triggers the listener

This could look like this in code with the first_radio_button as the default 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);

Place the OnCheckedChangeListener somewhere in your class:

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;
      // ...
    }
  }
};

This is my radio group 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>
Liminal answered 14/2, 2020 at 15:11 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.