Android单选按钮取消选中

时间:2013-04-05 14:40:35

标签: android button radio

该应用程序是一个步进音序器应用程序,具有16个无线电组,每组有8个按钮。除非我使用我创建的清除按钮清除所有放射线组,否则除非一组选择了一个按钮,否则它可以完美地工作。我想要添加的是一些代码,表示当再次选择所选单选按钮时,它会像切换一样关闭。我尝试使用切换,但随后出现了其他问题。以下是两次尝试,但两者都只是停止使用按钮

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

                }
            }   
        });

5 个答案:

答案 0 :(得分:18)

我最近有同样的需求 - 拥有一个无线电组,通过再次点击它可以取消选择所选项目。我发现我无法使用听众完成这项工作,但我 能够使用自定义RadioButton来完成它,就像这样...

public class ToggleableRadioButton extends RadioButton {
    // Implement necessary constructors

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

请注意,该按钮会根据其当前状态以不同方式切换 - 即,在按钮上调用setChecked(true)与在群组上调用clearCheck()。如果在两种情况下都使用setChecked(),则无法立即重新选择刚刚取消选择的按钮 - RadioGroup中的逻辑似乎会立即取消选择它。

要使用此按钮,只需在布局XML中将<RadioButton>标记替换为<your.package.ToggleableRadioButton>

答案 1 :(得分:6)

我刚刚使用了@spaaarky21

的答案

我的完整代码看起来像这样,它工作正常!

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

对于XML布局

<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" />

在这种情况下你只需要更改包,我很容易找到它,它只是Java Class Flie的顶部(如果你是从Android Studio创建的)

答案 2 :(得分:2)

从@ spaaarky21回答编辑

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

答案 3 :(得分:0)

这也是在做这项工作:

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

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

答案 4 :(得分:0)

您可以使用布尔值来打开和关闭按钮。

在代码中的某个位置添加布尔值:

var radioButton1IsSelected = false

然后为按钮设置onClickListener:

radioButton1.setOnClickListener {
        radioButton1IsSelected = !radioButton1IsSelected
        radioButton1.isChecked = radioButton1IsSelected
    }