Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Diseño personalizado para RadioButton

¿Hay alguna manera de cambiar el diseño de un RadioButton y todavía tengo el RadioGroup reconocerlo?

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

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

Así 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 ningún texto y se agrega en un TextView para que podamos tenerlo a la izquierda. Lo que estaba ocurriendo era que el texto estaba "subiendo".

Así que lo cambié para que parezca 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 el RadioButton pero no tengo idea de cómo cambiar el diseño allí.

  • RadioButtons con TextView en RadioGroup
  • Sólo un botón de radio seleccionado a la vez
  • RadioGroup llama a onCheckChanged () tres veces
  • Grupo de radio no está recibiendo el foco en Android
  • RadioGroup con dos columnas que tienen diez RadioButtons
  • ¿Posible que todos los botones de radio no estén marcados en una aplicación para Android?
  • Comprobación del campo vacío de RadioGroup mediante setError en Android
  • Cómo configurar OnClickListener en un RadioButton en Android?
  • 2 Solutions collect form web for “Diseño personalizado para RadioButton”

    Escribí un RadioGroup personalizado llamado RadioGroupPlus donde recorrerá a través de sus hijos y encontrara RadioButton independientemente de lo profundo que esté el RadioButton anidado, entonces enlazará todos los RadioButton encontrados juntos.

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

    El README del repo cubre cómo usarlo, y realmente funciona igual que como lo imaginas, 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> 

    Le dará algo como esto:

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

    Añadir esto al nivel superior build.gradle:

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

    Agregue esto bajo dependencias:

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

    Entonces en su xml, cambie RadioGroup a worker8.com.github.radiogroupplus.RadioGroupPlus . Ahora todos los RadioButton s bajo RadioGroupPlus deben estar unidos entre sí.

    ¡Espero eso ayude!

    Tendrás que crear una clase que extienda RadioGroup y reemplazar addView y PassThroughHierarchyChangeListener , para poder usar diseños personalizados para tu botón de opción . De forma predeterminada, RadioGroup asume que sus hijos son botones de radio, vea el código de abajo 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); } } } 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.