Можно ли изменить значок переключателя в группе переключателей Android

95

Я хочу предоставить пользователю моего приложения для Android возможность устанавливать некоторые параметры. Радиокнопка идеально подходит для этой ситуации. Однако мне не нравится рендеринг переключателей.

Можно ли изменить значок переключателя? Например, можно ли создать собственный макет для каждой строки и в этом макете ссылаться на мой собственный значок и изменить шрифт и др.

ямспог
источник

Ответы:

168

Да, возможно, вам нужно определить свой собственный стиль для переключателей в 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' должен быть отображаемым файлом с отслеживанием состояния, 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>

Затем просто примените пользовательскую тему либо ко всему приложению, либо к действиям по вашему выбору.

Для получения дополнительной информации о темах и стилях см. Http://brainflush.wordpress.com/2009/03/15/understanding-android-themes-and-styles/ , это хорошее руководство.

Константин Буров
источник
13
Вы также можете просто установить свойство android: button на самом переключателе, а не определять для него отдельный собственный стиль.
Йони Самлан
7
Верно, но это не очень хорошая практика, поскольку обычно у вас есть несколько переключателей.
Константин Буров
@KonstantinBurov а что, если я использую изображение с 9 патчами?
Hades
@KonstantinBurov Если вы не добавляете кнопки программно, тогда это здорово :)
Cornholio
1
Для темы поддержки может потребоваться использовать <style name = "CustomTheme" parent = "android: Theme"> <item name = "android: radioButtonStyle"> @ style / RadioButton </item> <item name = "radioButtonStyle"> @ style. / RadioButton </item> </style>
Дхрув Мевада
30

Вы можете поместить собственное изображение в радиокнопку, как обычную кнопку. для этого создайте один файл XML в папке с возможностью переноса, например

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

Здесь вы можете использовать 3 разных изображения для радиокнопки

и используйте этот файл для RadioButton, например:

android:button="@drawable/aus"
android:layout_height="120dp"
android:layout_width="wrap_content" 
Чираг
источник
13

Более простой способ изменить только переключатель - просто установить селектор на возможность рисования

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

И селектор:

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

Вот и все

topcbl
источник
1
Лучшее решение, для моего случая я также изменил 'drawableRight' на 'button' и добавил некоторые отступы в селектор xml
F-1,
Это лучшее решение. Я использовал этот способ, и он работает нормально. Но после перехода на andoidx android: button = "@ null" не работает, и мы видим два значка переключателя для каждого элемента! .
maniaq
1

да .... `из Xml

android:button="@drawable/yourdrawable" 

и с Java

myRadioButton.setButtonDrawable(resourceId or Drawable);

`

Швета Джария
источник
0

Вот, наверное, быстрый подход,

введите описание изображения здесь

С двумя значками, показанными выше, у вас будет что- RadioGroupто вроде этого

введите описание изображения здесь

  • изменить RadioGroupориентацию на горизонтальную
  • для каждого RadioButtonсвойства попробуйте указать значок для Button ниже CompoundButton,
  • отрегулируйте Padding и размер,
  • и установите атрибут Background, если он отмечен.
колунар
источник
0

Если вы хотите сделать это программно,

checkBoxOrRadioButton.setButtonDrawable(null);
checkBoxOrRadioButton.setBackgroundResource(R.drawable.resource_name);
Абхишек Кумар
источник