Пользовательский макет для RadioButton

Есть ли способ изменить макет для RadioButton и до сих пор RadioGroup узнает его?

Мне нужно, чтобы макет включал пару полей EditText, чтобы, когда пользователь выбрал эту кнопку, эти поля становятся активными. Я знаю, что могу создать пользовательскую часть на основе LinearLayout и установить свой собственный макет, используя: (LinearLayout) LayoutInflater.from (context) .inflate (R.layout.my_layout, this, true), но не может понять, как это сделать То же самое с переключателем.

Я пробовал вариант наличия дополнительных полей вне RadioGroup и выстраивания их с помощью кнопки, но это просто не работает. Кажется, он слишком зависим от устройства.

Это выглядит так:

<RadioGroup android:id="@+id/time_selector_radio_group" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toLeftOf="@id/time_selector_hours_prompt" android:layout_below="@id/time_selector_hours_prompt" android:layout_alignParentRight="true" android:gravity="right" android:orientation="vertical" android:checkedButton="@+id/time_selector_first_radio" > <RadioButton android:id="@+id/time_selector_first_radio" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="1dip" android:button="@drawable/radio_button_selector" /> <RadioButton android:id="@+id/time_selector_second_radio" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="1dip" android:button="@drawable/radio_button_selector" /> <RadioButton android:id="@+id/time_selector_third_radio" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="1dip" android:button="@drawable/radio_button_selector" /> <RadioButton android:id="@+id/time_selector_hours_radio" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="1dip" android:button="@drawable/radio_button_selector" /> </RadioGroup> <TextView android:id="@+id/time_selector_all_day_prompt" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toLeftOf="@id/time_selector_radio_group" android:layout_below="@id/time_selector_hours_prompt" android:layout_marginTop="11dip" android:text="@string/time_all_day" /> <TextView android:id="@+id/time_selector_before_noon_prompt" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toLeftOf="@id/time_selector_radio_group" android:layout_below="@id/time_selector_all_day_prompt" android:layout_marginTop="19dip" android:text="@string/time_before_noon" /> <TextView android:id="@+id/time_selector_after_noon_prompt" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toLeftOf="@id/time_selector_radio_group" android:layout_below="@id/time_selector_before_noon_prompt" android:layout_marginTop="19dip" android:text="@string/time_after_noon" /> <TextView android:id="@+id/time_selector_starting_time_prompt" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignRight="@id/time_selector_starting_date_prompt" android:layout_below="@id/time_selector_after_noon_prompt" android:layout_marginTop="20dip" android:layout_marginLeft="2dip" android:text="@string/advanced_time_selector_dialog_starting_time_prompt" /> <EditText android:id="@+id/time_selector_starting_time" android:layout_width="@dimen/advanced_time_selector_edit_texts_width" android:layout_height="wrap_content" android:layout_alignRight="@id/time_selector_starting_date" android:layout_alignBaseline="@id/time_selector_starting_time_prompt" android:textSize="14sp" android:paddingRight="10dip" android:paddingLeft="10dip" android:gravity="center" android:singleLine="true" android:maxWidth="@dimen/advanced_time_selector_edit_texts_width" android:background="@drawable/text_field_bg" android:inputType="datetime" /> <TextView android:id="@+id/time_selector_ending_time_prompt" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignRight="@id/time_selector_ending_date_prompt" android:layout_alignBottom="@id/time_selector_starting_time_prompt" android:layout_alignBaseline="@id/time_selector_starting_time_prompt" android:layout_marginRight="2dip" android:layout_marginLeft="2dip" android:text="@string/ending_date_prompt" /> <EditText android:id="@+id/time_selector_ending_time" android:layout_width="@dimen/advanced_time_selector_edit_texts_width" android:layout_height="wrap_content" android:layout_alignRight="@id/time_selector_ending_date" android:layout_alignBaseline="@id/time_selector_ending_time_prompt" android:textSize="14sp" android:paddingRight="10dip" android:paddingLeft="10dip" android:gravity="center" android:singleLine="true" android:maxWidth="@dimen/advanced_time_selector_edit_texts_width" android:background="@drawable/text_field_bg" android:inputType="datetime" /> 

Обратите внимание, что кнопка не имеет никакого текста и добавляется в TextView, так что мы можем иметь ее слева. Случилось то, что текст «ползет».

Итак, я изменил его так:

 <RadioGroup android:id="@+id/time_selector_radio_group" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toLeftOf="@id/time_selector_hours_prompt" android:layout_below="@id/time_selector_hours_prompt" android:layout_alignParentRight="true" android:layout_marginRight="30dip" android:gravity="right" android:orientation="vertical" android:checkedButton="@+id/time_selector_first_radio" > <RadioButton android:id="@+id/time_selector_all_day_radio" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="1dip" android:button="@null" android:drawableRight="@drawable/radio_button_selector" android:text="@string/time_all_day" android:textColor="@color/content_text_color" /> <RadioButton android:id="@+id/time_selector_before_noon_radio" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="1dip" android:button="@null" android:drawableRight="@drawable/radio_button_selector" android:text="@string/time_before_noon" android:textColor="@color/content_text_color" /> <RadioButton android:id="@+id/time_selector_after_noon_radio" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="1dip" android:button="@null" android:drawableRight="@drawable/radio_button_selector" android:text="@string/time_after_noon" android:textColor="@color/content_text_color" /> <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal"> <RadioButton android:id="@+id/time_selector_hours_radio" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="1dip" android:button="@null" android:drawableRight="@drawable/radio_button_selector" android:layout_alignParentRight="true" android:text="@string/advanced_time_selector_dialog_starting_time_prompt" android:textColor="@color/content_text_color" android:layout_marginLeft="-1dip" android:paddingLeft="-1dip" /> <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_toLeftOf="@id/time_selector_hours_radio" android:layout_alignParentLeft="true"> <EditText android:id="@+id/time_selector_starting_time" android:layout_width="@dimen/advanced_time_selector_edit_texts_width" android:layout_height="wrap_content" android:textSize="14sp" android:paddingRight="10dip" android:paddingLeft="10dip" android:gravity="center" android:singleLine="true" android:maxWidth="@dimen/advanced_time_selector_edit_texts_width" android:background="@drawable/text_field_bg" android:layout_alignParentRight="true" android:layout_alignBaseline="@id/time_selector_hours_radio" android:inputType="datetime" /> <TextView android:id="@+id/time_selector_ending_time_prompt" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="2dip" android:layout_marginLeft="2dip" android:text="@string/ending_date_prompt" android:layout_alignBaseline="@id/time_selector_hours_radio" android:layout_toLeftOf="@id/time_selector_starting_time" /> <EditText android:id="@+id/time_selector_ending_time" android:layout_width="@dimen/advanced_time_selector_edit_texts_width" android:layout_height="wrap_content" android:textSize="14sp" android:paddingRight="10dip" android:paddingLeft="10dip" android:gravity="center" android:singleLine="true" android:maxWidth="@dimen/advanced_time_selector_edit_texts_width" android:layout_toLeftOf="@id/time_selector_ending_time_prompt" android:layout_alignBaseline="@id/time_selector_hours_radio" android:background="@drawable/text_field_bg" android:inputType="datetime" /> </RelativeLayout> </RelativeLayout> </RadioGroup> и <RadioGroup android:id="@+id/time_selector_radio_group" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toLeftOf="@id/time_selector_hours_prompt" android:layout_below="@id/time_selector_hours_prompt" android:layout_alignParentRight="true" android:layout_marginRight="30dip" android:gravity="right" android:orientation="vertical" android:checkedButton="@+id/time_selector_first_radio" > <RadioButton android:id="@+id/time_selector_all_day_radio" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="1dip" android:button="@null" android:drawableRight="@drawable/radio_button_selector" android:text="@string/time_all_day" android:textColor="@color/content_text_color" /> <RadioButton android:id="@+id/time_selector_before_noon_radio" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="1dip" android:button="@null" android:drawableRight="@drawable/radio_button_selector" android:text="@string/time_before_noon" android:textColor="@color/content_text_color" /> <RadioButton android:id="@+id/time_selector_after_noon_radio" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="1dip" android:button="@null" android:drawableRight="@drawable/radio_button_selector" android:text="@string/time_after_noon" android:textColor="@color/content_text_color" /> <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal"> <RadioButton android:id="@+id/time_selector_hours_radio" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="1dip" android:button="@null" android:drawableRight="@drawable/radio_button_selector" android:layout_alignParentRight="true" android:text="@string/advanced_time_selector_dialog_starting_time_prompt" android:textColor="@color/content_text_color" android:layout_marginLeft="-1dip" android:paddingLeft="-1dip" /> <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_toLeftOf="@id/time_selector_hours_radio" android:layout_alignParentLeft="true"> <EditText android:id="@+id/time_selector_starting_time" android:layout_width="@dimen/advanced_time_selector_edit_texts_width" android:layout_height="wrap_content" android:textSize="14sp" android:paddingRight="10dip" android:paddingLeft="10dip" android:gravity="center" android:singleLine="true" android:maxWidth="@dimen/advanced_time_selector_edit_texts_width" android:background="@drawable/text_field_bg" android:layout_alignParentRight="true" android:layout_alignBaseline="@id/time_selector_hours_radio" android:inputType="datetime" /> <TextView android:id="@+id/time_selector_ending_time_prompt" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="2dip" android:layout_marginLeft="2dip" android:text="@string/ending_date_prompt" android:layout_alignBaseline="@id/time_selector_hours_radio" android:layout_toLeftOf="@id/time_selector_starting_time" /> <EditText android:id="@+id/time_selector_ending_time" android:layout_width="@dimen/advanced_time_selector_edit_texts_width" android:layout_height="wrap_content" android:textSize="14sp" android:paddingRight="10dip" android:paddingLeft="10dip" android:gravity="center" android:singleLine="true" android:maxWidth="@dimen/advanced_time_selector_edit_texts_width" android:layout_toLeftOf="@id/time_selector_ending_time_prompt" android:layout_alignBaseline="@id/time_selector_hours_radio" android:background="@drawable/text_field_bg" android:inputType="datetime" /> </RelativeLayout> </RelativeLayout> </RadioGroup> и <RadioGroup android:id="@+id/time_selector_radio_group" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toLeftOf="@id/time_selector_hours_prompt" android:layout_below="@id/time_selector_hours_prompt" android:layout_alignParentRight="true" android:layout_marginRight="30dip" android:gravity="right" android:orientation="vertical" android:checkedButton="@+id/time_selector_first_radio" > <RadioButton android:id="@+id/time_selector_all_day_radio" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="1dip" android:button="@null" android:drawableRight="@drawable/radio_button_selector" android:text="@string/time_all_day" android:textColor="@color/content_text_color" /> <RadioButton android:id="@+id/time_selector_before_noon_radio" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="1dip" android:button="@null" android:drawableRight="@drawable/radio_button_selector" android:text="@string/time_before_noon" android:textColor="@color/content_text_color" /> <RadioButton android:id="@+id/time_selector_after_noon_radio" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="1dip" android:button="@null" android:drawableRight="@drawable/radio_button_selector" android:text="@string/time_after_noon" android:textColor="@color/content_text_color" /> <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal"> <RadioButton android:id="@+id/time_selector_hours_radio" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="1dip" android:button="@null" android:drawableRight="@drawable/radio_button_selector" android:layout_alignParentRight="true" android:text="@string/advanced_time_selector_dialog_starting_time_prompt" android:textColor="@color/content_text_color" android:layout_marginLeft="-1dip" android:paddingLeft="-1dip" /> <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_toLeftOf="@id/time_selector_hours_radio" android:layout_alignParentLeft="true"> <EditText android:id="@+id/time_selector_starting_time" android:layout_width="@dimen/advanced_time_selector_edit_texts_width" android:layout_height="wrap_content" android:textSize="14sp" android:paddingRight="10dip" android:paddingLeft="10dip" android:gravity="center" android:singleLine="true" android:maxWidth="@dimen/advanced_time_selector_edit_texts_width" android:background="@drawable/text_field_bg" android:layout_alignParentRight="true" android:layout_alignBaseline="@id/time_selector_hours_radio" android:inputType="datetime" /> <TextView android:id="@+id/time_selector_ending_time_prompt" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="2dip" android:layout_marginLeft="2dip" android:text="@string/ending_date_prompt" android:layout_alignBaseline="@id/time_selector_hours_radio" android:layout_toLeftOf="@id/time_selector_starting_time" /> <EditText android:id="@+id/time_selector_ending_time" android:layout_width="@dimen/advanced_time_selector_edit_texts_width" android:layout_height="wrap_content" android:textSize="14sp" android:paddingRight="10dip" android:paddingLeft="10dip" android:gravity="center" android:singleLine="true" android:maxWidth="@dimen/advanced_time_selector_edit_texts_width" android:layout_toLeftOf="@id/time_selector_ending_time_prompt" android:layout_alignBaseline="@id/time_selector_hours_radio" android:background="@drawable/text_field_bg" android:inputType="datetime" /> </RelativeLayout> </RelativeLayout> </RadioGroup> 

Он по-прежнему не идеален и, конечно же, не признает его как RadioGroup.

Я хотел пойти в сторону расширения RadioButton, но понятия не имею, как изменить макет там.

Solutions Collecting From Web of "Пользовательский макет для RadioButton"

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

Здесь вы можете найти репо: https://github.com/worker8/RadioGroupPlus

README из репо охватывает, как его использовать, и он фактически работает так же, как вы его себе представляете, например:

 <worker8.com.github.radiogroupplus.RadioGroupPlus android:id="@+id/radio_group_plus" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <LinearLayout...> <ImageView...> <TextView...> <RadioButton...> </LinearLayout> <LinearLayout...> <ImageView...> <TextView...> <RadioButton...> </LinearLayout> <LinearLayout...> <ImageView...> <TextView...> <RadioButton...> </LinearLayout> </worker8.com.github.radiogroupplus.RadioGroupPlus> 

Дает вам что-то вроде этого:

В вашем случае, поскольку у вас уже есть файл макета xml, попробуйте загрузить RadioGroupPlus , следуя приведенному здесь руководству :

Добавьте это на верхний уровень build.gradle:

 allprojects { repositories { maven { url "https://jitpack.io" } } } 

Добавьте это под зависимостями:

 compile 'com.github.worker8:RadioGroupPlus:v1.0.1' 

Затем в xml измените RadioGroup на worker8.com.github.radiogroupplus.RadioGroupPlus . Теперь все ваши RadioButton RadioGroupPlus под RadioGroupPlus должны быть связаны друг с другом.

Надеюсь, поможет!

Вам нужно будет создать класс, расширяющий RadioGroup , и переопределить addView и PassThroughHierarchyChangeListener , чтобы иметь возможность использовать пользовательские макеты для вашего переключателя. По умолчанию RadioGroup предполагает, что его дочерние элементы являются переключателями, см. Код ниже в классе RadioGroup:

 @Override public void addView(View child, int index, ViewGroup.LayoutParams params) { if (child instanceof RadioButton) { final RadioButton button = (RadioButton) child; if (button.isChecked()) { mProtectFromCheckedChange = true; if (mCheckedId != -1) { setCheckedStateForView(mCheckedId, false); } mProtectFromCheckedChange = false; setCheckedId(button.getId()); } } super.addView(child, index, params); } private class PassThroughHierarchyChangeListener implements ViewGroup.OnHierarchyChangeListener { private ViewGroup.OnHierarchyChangeListener mOnHierarchyChangeListener; /** * {@inheritDoc} */ public void onChildViewAdded(View parent, View child) { if (parent == RadioGroup.this && child instanceof RadioButton) { int id = child.getId(); // generates an id if it's missing if (id == View.NO_ID) { id = View.generateViewId(); child.setId(id); } ((RadioButton) child).setOnCheckedChangeWidgetListener( mChildOnCheckedChangeListener); } if (mOnHierarchyChangeListener != null) { mOnHierarchyChangeListener.onChildViewAdded(parent, child); } } /** * {@inheritDoc} */ public void onChildViewRemoved(View parent, View child) { if (parent == RadioGroup.this && child instanceof RadioButton) { ((RadioButton) child).setOnCheckedChangeWidgetListener(null); } if (mOnHierarchyChangeListener != null) { mOnHierarchyChangeListener.onChildViewRemoved(parent, child); } } }