3

我想给用户四个选择,第一个和第二个选择在一行,第三个和第四个选择在另一行。我的问题是当应用程序启动时,我可以选择多个选项,但我不希望这样。这是我的 xml 布局:

<RadioGroup
        android:id="@+id/rgAnswerQuestionChoices"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >

        <LinearLayout
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:orientation="horizontal" >

            <RadioButton
                android:id="@+id/rAnswerQuestonChoic1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="RadioButton"
                android:visibility="invisible" />

            <RadioButton
                android:id="@+id/rAnswerQuestionChoice2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="RadioButton"
                android:visibility="invisible" />
        </LinearLayout>

        <LinearLayout
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:orientation="horizontal" >

            <RadioButton
                android:id="@+id/rAnswerQuestionChoice3"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="RadioButton"
                android:visibility="invisible" />

            <RadioButton
                android:id="@+id/rAnswerQuestionChoice4"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="RadioButton"
                android:visibility="invisible" />
        </LinearLayout>
    </RadioGroup>

我究竟做错了什么?

4

2 回答 2

6

如果您在RadioButtons和 父级之间放置其他布局Radiogroup(就像您对那些 所做的那样LinearLayouts),那么互斥将不再起作用。

要将它们RadioButtons放在一个两行表中,您可以自己制作您想要的RadioGroup位置,或者您可以尝试通过让两个表现得像一个来模拟该布局(例如,具有两列的 RadioGroup 有十个 RadioButtons)。RadioButtonsRadioGroups

于 2012-06-23T10:04:15.040 回答
1

我知道为时已晚,但我将其发布给在 android 中遇到此问题的任何人。如果您在 android 中使用,除了没有层次结构深度的确切孩子之外RadioGroup,您不能放置任何您想要的地方。因此,如果您想将其放入或在网格中管理它,按钮的行为不像它们属于该组(如果用户检查组中的另一个,它们将保持选中状态)。RadioButtonsRadioGroupRadioButtonsLinearLayoutRadioButton

我的解决方案

我写了一个名为的类RadioGroupCheckListener.java,并简单地使用这行代码来声明一个组:

RadioGroupCheckListener.makeGroup(radioButton1, radioButton2, radioButton3, radioButton4);

你可以RadioGroupCheckListener.java在我的 github RadioGroupCheckListener中找到

import android.widget.CompoundButton;


public class RadioGroupCheckListener implements CompoundButton.OnCheckedChangeListener {

    private CompoundButton[] allies;

    /**
     * public generator - indicate allies
     * @param allies all other buttons in the same RadioGroup
     */
    public RadioGroupCheckListener(CompoundButton... allies){
        this.allies = allies;
    }

    /**
     * listener for a button to turn other allies unchecked when it turn checked
     * @param buttonView change check occur with this button
     * @param isChecked result of changing
     */
    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        if(isChecked){
            for (CompoundButton aly : allies) {
                aly.setChecked(false);
            }
        }
    }

    /**
     * inner private function to remove one element from Buttons array
     * @param buttons all the buttons in RadioGroup
     * @param me the index that we want to remove from array
     * @return an array of CompoundButtons except the index of me
     */
    private static CompoundButton[] exceptMe(CompoundButton[] buttons, int me){
        CompoundButton[] result = new CompoundButton[buttons.length-1];
        for(int i=0,j=0;i<buttons.length;i++){
            if(i==me){
                continue;
            }
            result[j]=buttons[i];
            j++;
        }
        return result;
    }

    /**
     * static function to create a RadioGroup
     * if a button turn to checked state all other buttons is group turn unchecked
     * @param buttons the buttons that we want to act like RadioGroup
     */
    public static void makeGroup(CompoundButton... buttons){
        for(int i=0;i<buttons.length;i++){
            buttons[i].setOnCheckedChangeListener(new RadioGroupCheckListener(exceptMe(buttons, i)));
        }
    }
}
于 2018-02-13T09:37:26.643 回答