我怎样才能把 RadioButtons 作为他们 RadioGroup 的孙子?

How can I put RadioButtons as grandchildren from their RadioGroup a good way?

我有4个RadioButtons这样排列:

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <RadioGroup
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal"
                android:weightSum="2">

                <RadioButton
                    android:id="@+id/button1"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:text="Button 1"/>

                <RadioButton
                    android:id="@+id/button2"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:text="Button 2"/>

            </LinearLayout>

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal"
                android:weightSum="2">

                <RadioButton
                    android:id="@+id/button3"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:text="Button 3"/>

                <RadioButton
                    android:id="@+id/button4"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:text="Button 4"/>
            </LinearLayout>

        </LinearLayout>

    </RadioGroup>

</RelativeLayout>

我的问题是,现在每个 RadioButton 都可以一起按下并被选中。那不应该发生。必须始终选择一个或零个 RadioButtons,而不是多个。在正常的RadioGroup中,不会出现这个问题。我认为这是因为其中的 LinearLayout's,但我的应用程序的其余部分需要它们。我该如何解决这个问题?

我怎样才能把RadioButtons从他们RadioGroup当成孙子的好方法呢?

我建议您不要在 RadioGroup 中使用嵌套的嵌套布局 (Linear/Relative) 来增加视图层次结构。此外,您不会使用嵌套布局获得单选功能。 RadioGroup 实际上扩展了 LinearLayout。所以它只有垂直或水平排列单选按钮的能力。在这里我分享了 link RelativeRadioGroup 我的 Library 实际上是一个 RelativeRadioGroup 这样你就可以随意排列 RadioButtons 并且特别选择不会受到影响。

您不能在 RadioGroup 中放置任何其他布局。因此,如果您仍想将所有 RadioButton 置于线性布局中,您将不得不做一些额外的工作。

以编程方式执行,选中任何 RadioButton 时将其他 RadioButton 设为未选中。

类似

RadioButton rbu1 =(RadioButton)findViewById(R.id.radio0);
RadioButton rbu2 =(RadioButton)findViewById(R.id.radio1);
rbu1.setOnClickListener(first_radio_listener);
rbu2.setOnClickListener(second_radio_listener);
OnClickListener first_radio_listener = new OnClickListener (){
public void onClick(View v) {
  rbu2.setChecked(false);
 }
};
OnClickListener second_radio_listener = new OnClickListener (){
public void onClick(View v) {
  rbu1.setChecked(false);
 }
};

当您在 RadioGroup 中使用 LinearLayout 时,RadioGroup 失去了它的基本 functionalitytoggle 按钮 states 以及它的覆盖方法 onCheckedChanged() 永远不会被调用。

要解决此问题,您必须更改 RadioButton 状态 programmatically

这是一个完整的解决方案:

public class RadioGroupActivity extends AppCompatActivity implements RadioButton.OnCheckedChangeListener {

    RadioGroup radioGroup;
    RadioButton radioButton1;
    RadioButton radioButton2;
    RadioButton radioButton3;
    RadioButton radioButton4;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_radio_group);

        getSupportActionBar().setTitle("Hello Android");

        radioGroup = (RadioGroup) findViewById(R.id.radioGroup);
        radioButton1 = (RadioButton) findViewById(R.id.button1);
        radioButton2 = (RadioButton) findViewById(R.id.button2);
        radioButton3 = (RadioButton) findViewById(R.id.button3);
        radioButton4 = (RadioButton) findViewById(R.id.button4);

        radioButton1.setOnCheckedChangeListener(this);
        radioButton2.setOnCheckedChangeListener(this);
        radioButton3.setOnCheckedChangeListener(this);
        radioButton4.setOnCheckedChangeListener(this);
    }

    @Override
    public void onCheckedChanged(CompoundButton compoundButton, boolean status) {
        if (status)
        {
            switch (compoundButton.getId()) {
                case R.id.button1:
                    radioButton2.setChecked(false); radioButton3.setChecked(false); radioButton4.setChecked(false);

                    // Do something
                    Toast.makeText(getApplicationContext(), radioButton1.getText() + " clicked", Toast.LENGTH_SHORT).show();
                    break;

                case R.id.button2:
                    radioButton1.setChecked(false); radioButton3.setChecked(false); radioButton4.setChecked(false);

                    // Do something
                    Toast.makeText(getApplicationContext(), radioButton2.getText() + " clicked", Toast.LENGTH_SHORT).show();
                    break;

                case R.id.button3:
                    radioButton1.setChecked(false); radioButton2.setChecked(false); radioButton4.setChecked(false);

                    // Do something
                    Toast.makeText(getApplicationContext(), radioButton3.getText() + " clicked", Toast.LENGTH_SHORT).show();
                    break;

                case R.id.button4:
                    radioButton1.setChecked(false); radioButton2.setChecked(false); radioButton3.setChecked(false);

                    // Do something
                    Toast.makeText(getApplicationContext(), radioButton4.getText() + " clicked", Toast.LENGTH_SHORT).show();
                    break;
            }
        }

    }
}

输出:

希望对你有所帮助~