Как добавить радиогруппу к радиокнопкам внутри таблицы? - PullRequest
11 голосов
/ 02 марта 2010

У меня есть несколько радиокнопок, которые я хочу расположить с помощью таблицы, но также включить их в одну радиогруппу. У меня есть следующий формат XML:

<RadioGroup android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:orientation="vertical"
      android:id="@+id/Group1">

    <TableLayout android:id="@+id/RadioButtons" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content">

        <TableRow>
            <RadioButton android:id="@+id/rad1" 
                android:text="RButton1" 
                android:layout_width="105px" 
                android:layout_height="wrap_content" 
                android:textSize="13px"></RadioButton>
            <RadioButton android:id="@+id/rad2" 
                android:text="RButton2" 
                android:layout_width="105px" 
                android:textSize="13px" 
                android:layout_height="wrap_content"></RadioButton>
            <RadioButton android:id="@+id/rad3" 
                android:text="RButton3" 
                android:layout_width="105px" 
                android:textSize="13px" 
                android:layout_height="wrap_content"></RadioButton>
        </TableRow>
      </TableLayout>
</RadioGroup>  

Но, к сожалению, переключатели внутри таблицы, кажется, игнорируют тот факт, что они находятся внутри тегов RadioGroup, и из-за этого вы можете выбрать несколько переключателей одновременно. Я заметил, что, удаляя стол и просто имея переключатели, он работает просто отлично. Как я могу преодолеть это? Будет ли это так же просто, как объявить группу радиостанций внутри стола, а не снаружи? Спасибо за любую помощь.

Ответы [ 3 ]

7 голосов
/ 02 марта 2010

Ваши RadioButton виджеты должны быть непосредственными потомками RadioGroup, чтобы сработал групповой эффект.

3 голосов
/ 14 августа 2013

Вот мое расширение RadioGroup / RadioButton (SoftRadioGroup / SoftRadioButton). RadioGroup больше не требуется в макете XML. Вы можете сгруппировать RadioButtons с помощью свойства под названием group.

SoftRadioButton:

import java.util.HashMap;
import java.util.Random;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.RadioButton;

public class SoftRadioButton extends RadioButton {

    private static HashMap<String, SoftRadioGroup> GROUP_MAPPINGS = new HashMap<String, SoftRadioGroup>();
    private String mGroupName;

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

    public SoftRadioGroup getRadioGroup() {
        return GROUP_MAPPINGS.get(mGroupName);
    }

    private void addToGroup(AttributeSet attrs) {
        for (int i = 0; i < attrs.getAttributeCount(); i++) {
            if (attrs.getAttributeName(i).equals("group")) {
                String groupName = attrs.getAttributeValue(i);
                SoftRadioGroup group;
                if ((group = GROUP_MAPPINGS.get(groupName)) != null) {
                    // RadioGroup already exists
                    group.addView(this);
                    setOnClickListener(group);
                    mGroupName = groupName;

                } else {
                    // this is the first RadioButton in the RadioGroup
                    group = new SoftRadioGroup();
                    group.addView(this);
                    mGroupName = groupName;
                    setOnClickListener(group);

                    GROUP_MAPPINGS.put(groupName, group);
                }
                return;
            }
        }
        // group is not specified in the layout xml. Let's generate a random
        // RadioGroup
        SoftRadioGroup group = new SoftRadioGroup();
        group.addView(this);
        Random rn = new Random();
        String groupName;
        do {
            groupName = Integer.toString(rn.nextInt());
        } while (GROUP_MAPPINGS.containsKey(groupName));
        GROUP_MAPPINGS.put(groupName, group);
        mGroupName = groupName;
        setOnClickListener(group);

    }

}

SoftRadioGroup:

import java.util.ArrayList;

import android.view.View;
import android.view.View.OnClickListener;
import android.widget.RadioButton;

public class SoftRadioGroup implements OnClickListener {

    private ArrayList<RadioButton> buttons = new ArrayList<RadioButton>();

    public void addView(RadioButton button) {
        buttons.add(button);
    }

    @Override
    public void onClick(View v) {
        for (RadioButton button : buttons) {
            button.setChecked(false);
        }
        RadioButton button = (RadioButton) v;
        button.setChecked(true);
    }

    public RadioButton getCheckedRadioButton() {
        for (RadioButton button : buttons) {
            if (button.isSelected())
                return button;
        }
        return null;
    }

    public int getChildCount() {
        return buttons.size();
    }

    public RadioButton getChildAt(int i) {
        return buttons.get(i);
    }

    public void check(SoftRadioButton button) {
        if (buttons.contains(button)) {
            for (RadioButton b : buttons) {
                b.setChecked(false);
            }
        }
    }

}

Использование в XML-макете, встроенном в таблицу (2 группы с 2 кнопками на группу):

<TableLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:stretchColumns="1" >

            <TableRow
                android:id="@+id/tableRow1"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content" >

                <Your.Package.SoftRadioButton
                    android:id="@+id/filterActivity_RadioButton_byDate"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:checked="true"
                    android:contentDescription="date"
                    android:text="@string/filterActivity_RadioButton_byDate"
                    fake:group="orderBy" />

                <Your.Package.SoftRadioButton
                    android:id="@+id/filterActivity_RadioButton_byPrice"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:contentDescription="price"
                    android:text="@string/filterActivity_RadioButton_byPrice"
                    fake:group="orderBy" />
            </TableRow>

            <TableRow
                android:id="@+id/tableRow2"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content" >

                <Your.Package.SoftRadioButton
                    android:id="@+id/filterActivity_RadioButton_asc"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:contentDescription="down"
                    android:text="@string/filterActivity_RadioButton_asc"
                    fake:group="direction" />

                <Your.Package.SoftRadioButton
                    android:id="@+id/filterActivity_RadioButton_desc"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:checked="true"
                    android:contentDescription="up"
                    android:text="@string/filterActivity_RadioButton_desc"
                    fake:group="direction" />
            </TableRow>
        </TableLayout>
0 голосов
/ 03 августа 2013
rg1 = (RadioGroup)findViewById(R.id.radioGroup1);
        rg2 = (RadioGroup)findViewById(R.id.radioGroup2);
        rg1.setOnCheckedChangeListener(this);
        rg2.setOnCheckedChangeListener(this);
    }
    boolean rg1b = false;
    boolean rg2b = false;

    @Override
    public void onCheckedChanged(RadioGroup rgId, int radioButtonId) {
        switch (rgId.getId()) {
        case R.id.radioGroup1:
            rg1b=true;
            if(rg2b)
                rg2.clearCheck();
            break;

        case R.id.radioGroup2:
            rg1b=true;
            if(rg1b)
                rg1.clearCheck();
            break;
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...