¿Es posible cambiar el icono del botón de radio en un grupo de botones de radio de Android?

95

Quiero permitirle al usuario de mi aplicación de Android la capacidad de establecer algunos parámetros. El botón de opción es ideal para esta situación. Sin embargo, no me gusta que se rendericen los botones de opción.

¿Es posible cambiar el icono del botón de opción? Por ejemplo, ¿es posible crear un diseño personalizado para cada fila y en ese diseño hacer referencia a mi propio icono y cambiar la fuente et al.

yamspog
fuente

Respuestas:

168

Sí, es posible que tenga que definir su propio estilo para los botones de opción, en res / values ​​/ styles.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="CustomTheme" parent="android:Theme">
   <item name="android:radioButtonStyle">@style/RadioButton</item>
</style>
<style name="RadioButton" parent="@android:style/Widget.CompoundButton.RadioButton">
   <item name="android:button">@drawable/radio</item>
</style>
</resources>

'radio' aquí debería ser un dibujable con estado, radio.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="true" android:state_window_focused="false"
        android:drawable="@drawable/radio_hover" />
    <item android:state_checked="false" android:state_window_focused="false"
        android:drawable="@drawable/radio_normal" />
    <item android:state_checked="true" android:state_pressed="true"
        android:drawable="@drawable/radio_active" />
    <item android:state_checked="false" android:state_pressed="true"
        android:drawable="@drawable/radio_active" />
    <item android:state_checked="true" android:state_focused="true"
        android:drawable="@drawable/radio_hover" />
    <item android:state_checked="false" android:state_focused="true"
        android:drawable="@drawable/radio_normal_off" />
    <item android:state_checked="false" android:drawable="@drawable/radio_normal" />
    <item android:state_checked="true" android:drawable="@drawable/radio_hover" />
    </selector>

Luego, simplemente aplique el tema personalizado a toda la aplicación o a las actividades que elija.

Para obtener más información sobre temas y estilos, consulte http://brainflush.wordpress.com/2009/03/15/understanding-android-themes-and-styles/ que es una buena guía.

Konstantin Burov
fuente
13
También puede configurar la propiedad android: button en el botón de radio en sí, en lugar de definir un estilo personalizado separado para él.
Yoni Samlan
7
Es cierto, pero eso no es una buena práctica, ya que normalmente tiene más de un botón de opción.
Konstantin Burov
@KonstantinBurov ¿y si estoy usando una imagen de 9 parches?
Hades
@KonstantinBurov A menos que esté agregando botones mediante programación, en cuyo caso es genial :)
Cornholio
1
Para el tema de soporte, es posible que desee utilizar <style name = "CustomTheme" parent = "android: Theme"> <item name = "android: radioButtonStyle"> @ style / RadioButton </item> <item name = "radioButtonStyle"> @ style / RadioButton </item> </style>
Dhruv Mevada
30

Puede poner una imagen personalizada en el botón de radio como un botón normal. para eso, cree un archivo XML en una carpeta dibujable, por ejemplo

<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/sub_screens_aus_hl" 
    android:state_pressed="true"/>  
<item android:drawable="@drawable/sub_screens_aus" 
    android:state_checked="true"/>  
<item android:drawable="@drawable/sub_screens_aus" 
    android:state_focused="true" />
<item android:drawable="@drawable/sub_screens_aus_dis" />  
</selector> 

Aquí puede utilizar 3 imágenes diferentes para el botón de radio

y use este archivo para RadioButton como:

android:button="@drawable/aus"
android:layout_height="120dp"
android:layout_width="wrap_content" 
Chirag
fuente
13

La forma más fácil de cambiar solo el botón de opción es simplemente configurar el selector para que se pueda dibujar a la derecha

<RadioButton
    ...
    android:button="@null"
    android:checked="false"
    android:drawableRight="@drawable/radio_button_selector" />

Y el selector es:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/ic_checkbox_checked" android:state_checked="true" />
    <item android:drawable="@drawable/ic_checkbox_unchecked" android:state_checked="false" /></selector>

Eso es todo

topcbl
fuente
1
La mejor solución, para mi caso también cambié 'drawableRight' a 'button' y agregué algo de relleno al selector xml
F-1
Ésta es la mejor solución. Me utilizaron de esta manera y funciona bien. Pero después de migrar a andoidx android: button = "@ null" no funciona y vemos dos botones de radio para cada elemento. .
maniaq
1

sí .... `de Xml

android:button="@drawable/yourdrawable" 

y de Java

myRadioButton.setButtonDrawable(resourceId or Drawable);

'

shweta jariya
fuente
0

Probablemente este sea un enfoque rápido,

ingrese la descripción de la imagen aquí

Con dos iconos mostrados arriba, tendrás RadioGroupalgo como esto

ingrese la descripción de la imagen aquí

  • cambiar la RadioGrouporientación de 'a horizontal
  • para RadioButtonlas Propiedades de cada uno , intente dar el icono para Button debajo CompoundButton,
  • ajustar el acolchado y el tamaño,
  • y establezca el atributo Fondo cuando esté marcado.
kolunar
fuente
0

En caso de que desee hacerlo mediante programación,

checkBoxOrRadioButton.setButtonDrawable(null);
checkBoxOrRadioButton.setBackgroundResource(R.drawable.resource_name);
Abhishek Kumar
fuente