RadioGroup только с одним выбранным элементом

Я пытаюсь сделать RadioGroup как на картинке. Я хочу, чтобы за раз проверялся только один RadioButton.

Это то, что я сделал, чтобы добиться этого.

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

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

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

        <RadioButton
            android:id="@+id/radio2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="@string/radio2" />
    </RadioGroup>

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

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

        <RadioButton
            android:id="@+id/radio4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="@string/radio4" />
    </RadioGroup>
</RadioGroup>

Вот изображение

Что я хочу

Но с помощью этого я могу выбрать любой из каждой строки, т.е. можно выбрать 2 элемента. Как это:

введите здесь описание изображения

Помогите пожалуйста мне...


person AnujMathur_07    schedule 29.05.2013    source источник
comment
Смотрите мой ответ здесь: stackoverflow.com/questions/37313559/   -  person Levon Petrosyan    schedule 31.01.2019


Ответы (1)


введите здесь описание изображения

ОБНОВЛЕНО

Вы можете динамически отменить выбор RadioButton при нажатии на другой RadioButton. Для этого мне пришлось поиграть с добавлением View к ViewGroup, что определяется получением желаемого index из TableRow.

Как показано на рисунке выше, он должен быть расположен в виде сетки с выбранным в любой момент времени только одним переключателем. См. приведенные ниже коды:

.xml:

<?xml version="1.0" encoding="utf-8"?>
<com.example.test.RadioButtonWithTableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" >

    <TableRow>

        <RadioButton
            android:id="@+id/radio1"
            android:text="Radio 1" />

        <RadioButton
            android:id="@+id/radio3"
            android:text="Radio 3" />
    </TableRow>

    <TableRow>

        <RadioButton
            android:id="@+id/radio2"
            android:text="Radio 2" />

        <RadioButton
            android:id="@+id/radio4"
            android:text="Radio 4" >
        </RadioButton>
    </TableRow>

</com.example.test.RadioButtonWithTableLayout>

.java:

public class RadioButtonWithTableLayout extends TableLayout implements
        OnClickListener {

    private RadioButton mBtnCurrentRadio;

    public RadioButtonWithTableLayout(Context context) {
        super(context);
    }

    public RadioButtonWithTableLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public void onClick(View v) {
        final RadioButton mBtnRadio = (RadioButton) v;

        // select only one radio button at any given time
        if (mBtnCurrentRadio != null) {
            mBtnCurrentRadio.setChecked(false);
        }
        mBtnRadio.setChecked(true);
        mBtnCurrentRadio = mBtnRadio;
    }

    @Override
    public void addView(View child, int index,
            android.view.ViewGroup.LayoutParams params) {
        super.addView(child, index, params);
        setChildrenOnClickListener((TableRow) child);
    }

    @Override
    public void addView(View child, android.view.ViewGroup.LayoutParams params) {
        super.addView(child, params);
        setChildrenOnClickListener((TableRow) child);
    }

    private void setChildrenOnClickListener(TableRow tr) {
        final int c = tr.getChildCount();
        for (int i = 0; i < c; i++) {
            final View v = tr.getChildAt(i);
            if (v instanceof RadioButton) {
                v.setOnClickListener(this);
            }
        }
    }
}

Источник: http://developer.android.com/reference/android/widget/RadioGroup.html http://developer.android.com/reference/android/widget/TableRow.html

person melvynkim    schedule 29.05.2013
comment
Спасибо за ответ. Но при этом все RadioButton будут выровнены по vertically. Таким образом, требование, которое я просил сделать группу, как на изображении, не выполнено. - person AnujMathur_07; 29.05.2013
comment
@AnujMathur_07 Попробуйте установить родительский макет RadioGroup как RelativeLayout и поиграть с android=alignParentBottom=true или android=alignParentRight=true и т. д. для каждого RadioButton, пока не получите желаемый макет. - person melvynkim; 29.05.2013
comment
Родителем RadioButton является RadioGroup, поэтому ни один из этих атрибутов недоступен. - person AnujMathur_07; 29.05.2013
comment
@AnujMathur_07 Обновил пример в ответе. Пожалуйста, попробуйте их и сообщите мне, если у вас все еще есть проблемы! - person melvynkim; 29.05.2013
comment
извини мелвким. Он по-прежнему показывает RadioButtons, выровненные по вертикали. - person AnujMathur_07; 29.05.2013
comment
Теперь о вашем обновленном ответе. Вид в порядке, как я и хотел, но теперь я могу выбрать все кнопки. - person AnujMathur_07; 29.05.2013
comment
я думаю, вы должны программно снять все переключатели, если они будут выбраны: button.setChecked(false) & on refresh buttons.clearCheck(); - person Deepanker Chaudhary; 29.05.2013
comment
@AnujMathur_07 Спасибо за ожидание. Я снова обновил свой ответ с помощью файла .java. Я понял, что вы можете динамически деактивировать отмеченный RadioButton. - person melvynkim; 29.05.2013
comment
Спасибо за ответ, теперь все работает нормально, я просто хочу знать, нельзя ли это сделать в файле xml? - person AnujMathur_07; 30.05.2013
comment
@AnujMathur_07 Я так не думаю, и вот причина. Подкласс android.view.ViewGroup (например, RelativeLayout) наследует XML-атрибуты (например, android:layout_alignParentTop) только своему прямому потомку [ren], который в нашем примере равен RadioGroup. И RadioGroup должен быть прямым родителем RadioButton объектов, чтобы связать их вместе и создать экземпляр только одной кнопки, которая будет проверяться за раз. Поэтому, используя предоставленную вами структуру XML (Layout-›RadioGroup-›RadioButton), мы не сможем свободно позиционировать RadioButton для создания макета в виде сетки. - person melvynkim; 01.06.2013
comment
В качестве примечания, нам все равно часто приходится добавлять свойства к объектам RadioButton (например, чтобы генерировать Toast для взаимодействия с пользователем, когда он/она выбирает кнопки), мы, скорее всего, собираемся написать класс для управления этим пользовательским действием. Совершенно уместно создать файл класса в качестве одного из виджетов в нашем пути к проекту и настроить его по своему усмотрению. - person melvynkim; 01.06.2013