É possível alterar o ícone do botão de rádio em um grupo de botões de rádio do Android

95

Desejo permitir ao usuário do meu aplicativo Android a capacidade de definir alguns parâmetros. O botão de opção é ideal para essa situação. No entanto, não gosto que os botões de opção sejam renderizados.

É possível alterar o ícone do botão de rádio? Por exemplo, é possível criar um layout personalizado para cada linha e nesse layout referenciar meu próprio ícone e alterar a fonte et al.

yamspog
fonte

Respostas:

168

Sim, é possível, você deve definir seu próprio estilo para os botões de opção, em 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' aqui deve ser um drawable com 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>

Em seguida, basta aplicar o tema personalizado a todo o aplicativo ou às atividades de sua escolha.

Para obter mais informações sobre temas e estilos, consulte http://brainflush.wordpress.com/2009/03/15/understanding-android-themes-and-styles/ que é um bom guia.

Konstantin Burov
fonte
13
Você também pode apenas definir a propriedade android: button no próprio botão de rádio, em vez de definir um estilo personalizado separado para ele.
Yoni Samlan
7
É verdade, mas isso não é uma prática muito boa, já que geralmente você tem mais do que apenas um botão de opção.
Konstantin Burov
@KonstantinBurov e se eu estiver usando uma imagem de 9 patch?
Hades de
@KonstantinBurov A menos que você esteja adicionando botões de forma programática, nesse caso é ótimo :)
Cornholio
1
Para tema de suporte, convém usar <style name = "CustomTheme" parent = "android: Theme"> <item name = "android: radioButtonStyle"> @ style / RadioButton </item> <item name = "radioButtonStyle"> @ style / RadioButton </item> </style>
Dhruv Mevada
30

Você pode colocar a imagem personalizada no botão de opção como o botão normal. para isso, crie um arquivo XML na pasta drawable, por exemplo

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

Aqui você pode usar 3 imagens diferentes para o botão de rádio

e use este arquivo para RadioButton como:

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

A maneira mais fácil de alterar apenas o botão de opção é simplesmente definir o seletor para drawable right

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

E o seletor é:

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

Isso é tudo

topcbl
fonte
1
Melhor solução, para o meu caso eu também mudei 'drawableRight' para 'button' e adicionei algum preenchimento ao seletor xml
F-1
Esta é a melhor solução. Fui usado dessa forma e funciona bem. Mas depois de migrar para o andoidx android: button = "@ null" não funciona e vemos dois ícones de botão de opção para cada item! .
maniaq
1

sim .... `do Xml

android:button="@drawable/yourdrawable" 

e de Java

myRadioButton.setButtonDrawable(resourceId or Drawable);

`

shweta jariya
fonte
0

Esta é provavelmente uma abordagem rápida,

insira a descrição da imagem aqui

Com os dois ícones mostrados acima, você deve ter RadioGroupalgo parecido com este

insira a descrição da imagem aqui

  • mude a RadioGrouporientação de para horizontal
  • para cada RadioButtonPropriedades de, tente dar o ícone para Button abaixo CompoundButton,
  • ajuste o preenchimento e o tamanho,
  • e defina o atributo Background quando marcado.
Kolunar
fonte
0

Caso você queira fazer isso de forma programática,

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