4

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

6 回答 6

22

我最近有同样的需求 - 有一个收音机组,可以通过再次点击它来取消选择所选项目。我发现我无法使用 listeners 来完成它,但我可以使用 custom 来完成它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似乎立即取消选择它。

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

于 2014-03-07T22:47:15.370 回答
7

我刚刚使用了@spaarky21的答案

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

Java 类

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 创建的)

于 2016-06-23T09:39:04.857 回答
5

它实际上可以通过侦听器完成,但使用OnTouchListener,它将在按钮状态更改之前触发,而不是通常的OnClickListener. 以下对我有用:

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

radioGroup的父母在哪里radioButton1radioButton2

于 2015-09-10T08:36:56.830 回答
3

从@spaarky21 回答编辑

@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);
    }
}
于 2016-10-10T03:14:08.283 回答
1

这也在做这项工作:

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

  @Override public void toggle() {
    setChecked(!isChecked());
  }
}
于 2017-03-08T14:22:52.870 回答
0

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

在代码中的某处添加一个布尔值:

var radioButton1IsSelected = false

然后为按钮设置 onClickListener:

radioButton1.setOnClickListener {
        radioButton1IsSelected = !radioButton1IsSelected
        radioButton1.isChecked = radioButton1IsSelected
    }
于 2020-10-30T22:50:55.327 回答