3

ユーザーに4つの選択肢を提供したいと思います。1行目の1番目と2番目の選択肢と、別の行の3番目と4番目の選択肢です。私の問題は、アプリケーションの起動時に複数の選択肢を選択できることですが、それは望ましくありません。これは私の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を2行のテーブルに配置するには、好きなRadioGroup場所に配置する独自のテーブルを作成するか、2つを1つとして動作させることでそのレイアウトをシミュレートすることができます(たとえば、10個のRadioButtonを持つ2つの列を持つRadioGroup)。RadioButtonsRadioGroups

于 2012-06-23T10:04:15.040 に答える
1

私はそれが遅いことを知っていますが、Androidでこの問題に直面している人のために投稿します。RadioGroupアンドロイドで使用する場合、階層の深さのないRadioButtonsあなたの正確な子を除いて、あなたが望む場所に置くことはできません。RadioGroupしたがって、ボタンをグリッドに配置したり、グリッドで管理RadioButtonsLinearLayoutたりする場合、ボタンはグループに属しているようには機能しません(ユーザーRadioButtonがグループ内の別のボタンをチェックした場合、ボタンはチェックされたままになります)。

私の解決策

私はという名前のクラスRadioGroupCheckListener.javaを作成し、このコード行を使用してグループを宣言しました。

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

RadioGroupCheckListener.javaあなたは私のgithubRadioGroupCheckListenerで見つけることができます

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 に答える