validar studio sirve radiobutton que para horizontal custom agrupar activar android radio-button radio-group

studio - radiobutton android checked



DiseƱo personalizado para RadioButton (2)

Deberá crear una clase que amplíe RadioGroup y anular addView y PassThroughHierarchyChangeListener , para poder usar diseños personalizados para su botón de opción . De forma predeterminada, RadioGroup asume que sus hijos son botones de opción, vea el siguiente código de la clase 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); } } }

¿Hay alguna manera de que pueda cambiar el diseño de un RadioButton y aún así tener el RadioGroup para reconocerlo?

lo que necesito es que el diseño incluya un par de campos EditText para que cuando el usuario seleccione ese botón esos campos se activen. Sé que puedo construir una parte personalizada basada en LinearLayout y establecer mi propio diseño usando: (LinearLayout) LayoutInflater.from (context) .inflate (R.layout.my_layout, this, true) pero no puedo entender cómo hacer Lo mismo con un botón de radio.

He intentado la opción de tener los campos adicionales fuera del RadioGroup y alinearlos con el botón, pero simplemente no funciona. Parece ser demasiado dependiente del dispositivo.

Así es como se veía el diseño original:

<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" />

Tenga en cuenta que el botón no tiene texto y se agrega en un TextView para que podamos tenerlo a la izquierda. Lo que sucedía era que el texto estaba "trepando".

Entonces, lo cambié para que se vea así:

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

Todavía no es perfecto y, por supuesto, no lo reconoce como un RadioGroup.

Quería ir en la dirección de extender RadioButton pero no tengo idea de cómo cambiar el diseño allí.


Escribí un RadioGroup personalizado llamado RadioGroupPlus donde atravesará sus niños y encontrará RadioButton independientemente de qué tan profundo esté anidado el RadioButton , y luego vinculará todos los RadioButton encontrados juntos.

Puede encontrar el repositorio aquí: https://github.com/worker8/RadioGroupPlus

El README del repositorio cubre cómo usarlo, y realmente funciona tal como lo imagina, por ejemplo:

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

Te dará algo como esto:

En su caso, como ya tiene el archivo de diseño xml, intente descargar RadioGroupPlus siguiendo la guía aquí :

Agregue esto al build.gradle de nivel superior:

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

Agregue esto debajo de dependencias:

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

Luego, en su xml, cambie RadioGroup a worker8.com.github.radiogroupplus.RadioGroupPlus . Ahora todos sus RadioButton s en RadioGroupPlus deberían estar todos vinculados.

¡Espero eso ayude!