该应用程序是一个步进音序器应用程序,具有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);
}
}
});
答案 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
}