Intereting Posts
Как выйти из полноэкранного режима в эмуляторе Android Как открыть PDF-файл, хранящийся в папке res / raw или assets? Как добавить объект в начало списка в ArrayAdapter? TypeArray в Android – Как сохранить пользовательские объекты в xml и получить их? Прослушивание ключевых слов во все времена, например «Ok google» на 4.4 Android: как определить, вспыхнула ли камера Код для добавления маркеров для сопоставления с помощью Android-карт google v2 Как я могу заставить свою службу Android работать, когда экран выключен? Android – показать / скрыть фрагмент покинет пустую область Какой из них использовать NavUtils.navigateUpFromSameTask () vs. onBackPressed () Предотвращение восстановления фрагментов в Android Как проверить, установлен ли флажок андроида в его методе onClick (объявлен в XML)? Как лицензировать приложение для Android? Как изменить тост-сообщение, которое появляется после успешной покупки продукта в биллинге в приложении Ошибка градиента со знаком доллара

Как добавить радиогруппу к переключателям внутри таблицы?

У меня есть несколько переключателей, которые я хочу разместить с помощью таблицы, но также включаю их в одну группу радио. У меня есть следующий 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, и из-за этого вы можете выбрать одновременно несколько радиокнопек. Я заметил, что, удалив таблицу и просто используя радиокнопки, она работает нормально. Как я могу это преодолеть? Было бы так же просто, как объявить радиогруппу внутри таблицы вместо внешней? Спасибо за любую помощь.

Solutions Collecting From Web of "Как добавить радиогруппу к переключателям внутри таблицы?"

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

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

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> 
 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; }