Android radio button uncheck

别来无恙 提交于 2020-01-02 05:12:46

问题


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

                }
            }   
        });

回答1:


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.




回答2:


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)




回答3:


It actually can be done with listeners but with an OnTouchListener, which will trigger before the button's state has changed, instead of the usual OnClickListener. The following works for me:

View.OnTouchListener radioButtonOnTouchListener = new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if (((RadioButton) v).isChecked()) {
            // If the button was already checked, uncheck them all
            radioGroup.clearCheck();
            // Prevent the system from re-checking it
            return true;
        }
        return false;
    }
};
radioButton1.setOnTouchListener(radioButtonOnTouchListener);
radioButton2.setOnTouchListener(radioButtonOnTouchListener);

Where radioGroup is the parent of radioButton1 and radioButton2




回答4:


Edit from @spaaarky21 answer

@Override
public void toggle() {
    if (isChecked()) {
        if (getParent() instanceof RadioGroup) {
            ((RadioGroup) getParent()).clearCheck();
        } 
        // add else here when a single radioButton without radioGroup
        else {
            setChecked(false);
        }
    } else {
        setChecked(true);
    }
}



回答5:


This is also doing the job:

public final class ToggleAbleRadioButton extends AppCompatRadioButton {
  public ToggleAbleRadioButton(final Context context, final AttributeSet attrs) {
    super(context, attrs);
  }

  @Override public void toggle() {
    setChecked(!isChecked());
  }
}


来源:https://stackoverflow.com/questions/15836789/android-radio-button-uncheck

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!