Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android radio button uncheck

The application is a step sequencer application with 16 radio groups with 8 buttons in each group. It works perfectly except once a group has a button selected I cant turn it off unless I use the clear button I have created to clear all radiogroups. What I would like to add is some code that says when a selected radio button is selected again it simply turns off like a toggle. I tried using toggles but then other issues arose with that method. Below are two attempts but both simply stops me using the button

final RadioGroup radioGroup1 = (RadioGroup) findViewById(R.id.RadioGroup1);
RadioButton D1 = (RadioButton) findViewById(R.id.RadioButtonD1);

Button D1 = (Button) findViewById(R.id.RadioButtonD1);
D1.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick (View v){
        PdBase.sendFloat("D1", 74);
        int selectedTypeId = radioGroup1.getCheckedRadioButtonId();
        RadioButton D1 = (RadioButton) findViewById(selectedTypeId);
        if (D1 != null) // This will be null if none of the radio buttons are selected
            radioGroup1.clearCheck();
        PdBase.sendFloat("D1", 0);
    }
});

RadioButton lC1 = (RadioButton) findViewById(R.id.RadioButtonlowC1);
lC1.setOnClickListener(new View.OnClickListener() {
    public void onClick (View v) {
        int selectedTypeId = radioGroup1.getCheckedRadioButtonId();

        RadioButton lC1 = (RadioButton) findViewById(R.id.RadioButtonlowC1);
        if (selectedTypeId == -1) {
            PdBase.sendFloat("lC1", 72);
        }
        else if (selectedTypeId == R.id.RadioButtonlowC1) {
            radioGroup1.clearCheck();
            PdBase.sendFloat("lC1", 0);
        }
    }
});
like image 804
A B Avatar asked Nov 27 '22 00:11

A B


2 Answers

I recently had the same need - to have a radio group where the selected item could be deselected by tapping it again. I found that I couldn't accomplish that using listeners but I was able to do it using a custom RadioButton, like so...

public class ToggleableRadioButton extends RadioButton {
    // Implement necessary constructors

    @Override
    public void toggle() {
        if(isChecked()) {
            if(getParent() instanceof RadioGroup) {
                ((RadioGroup)getParent()).clearCheck();
            }
        } else {
            setChecked(true);
        }
    }
}

Notice that the button is toggled in different ways depending on its current state - i.e., calling setChecked(true) on the button vs. calling clearCheck() on the group. If setChecked() is used in both cases, a button that was just deselected cannot be immediately re-selected - the logic in RadioGroup seems to immediately deselect it.

To use this button, just replace your <RadioButton> tags with <your.package.ToggleableRadioButton> in your layout XML.

like image 96
spaaarky21 Avatar answered Dec 22 '22 19:12

spaaarky21


I just used the answer from @spaaarky21

and my full code look like this and it is working fine!

Java Class

public class ToggleableRadioButton extends RadioButton {


    public ToggleableRadioButton(Context context) {
        super(context);
    }

    public ToggleableRadioButton(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public ToggleableRadioButton(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    public ToggleableRadioButton(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

    @Override
    public void toggle() {
        if(isChecked()) {
            if(getParent() instanceof RadioGroup) {
                ((RadioGroup)getParent()).clearCheck();
            }
        } else {
            setChecked(true);
        }
    }
}

And for the XML layout

<com.smart_dent.adapters.ToggleableRadioButton android:id="@+id/tejido_blando_perfil_convexo"
                                 android:layout_width="wrap_content"
                                 android:layout_height="wrap_content"
                                 android:text="@string/tejido_blando_convexo_label" />

In this case you just need to change the package, I this is easy to find, it is just at the top of the Java Class Flie (if you created it from Android Studio)

like image 41
user2356433 Avatar answered Dec 22 '22 18:12

user2356433