Пользовательский стиль флажка в диалоговом окне

Я создаю диалог с элементами с несколькими вариантами выбора (флажки):

AlertDialog.Builder builder = new AlertDialog.Builder(this);

builder.setMultiChoiceItems(arrayResource, selectedItems, new DialogInterface.OnMultiChoiceClickListener() {
    // ...
});

AlertDialog dialog = builder.create();
dialog.show();

И у меня есть собственный стиль для флажков:

<style name="CustomCheckBox" parent="@android:style/Widget.CompoundButton.CheckBox">
    <item name="android:button">@drawable/btn_check</item>
    <item name="android:textColor">@android:color/holo_purple</item>
</style>

Он отлично работает при применении к отдельным флажкам в макете, установив style="@style/CustomCheckBox".

Но как я могу применить этот стиль к созданному диалоговому окну? Или, альтернативно, для всей темы...

Если это так важно - я использую minSdkVersion=14 и targetSdkVersion=19.


Update:

Теперь, согласно ответам MattMatt, я применяю собственный стиль флажка для всей темы, а также настраивает собственный стиль для диалогов:

<style name="AppTheme" parent="AppBaseTheme">
    <item name="android:checkboxStyle">@style/CustomCheckBox</item>
    <item name="android:dialogTheme">@style/CustomDialog</item>
    <item name="android:alertDialogTheme">@style/CustomDialog</item>
</style>

<style name="CustomCheckBox" parent="@android:style/Widget.CompoundButton.CheckBox">
    <item name="android:button">@drawable/btn_check</item>
    <item name="android:checkMark">@drawable/btn_check</item>
</style>

<style name="CustomDialog" parent="@android:style/Theme.Holo.Light.Dialog">
    <item name="android:checkboxStyle">@style/CustomCheckBox</item>
    <item name="android:background">#aaf</item>
</style>

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

Ответы

Ответ 1

На самом деле вызов setMultiChoiceItems не приводит к виджетам CheckBox, но виджетам CheckedTextView. [Обновлено] Также кажется, что изменение значения атрибута checkMark не имеет никакого эффекта. Однако, изменив значение атрибута listChoiceIndicatorMultiple для стиля CustomDialog, я смог изменить выделение для выбора. Вот так:

<style name="CustomDialog" parent="@android:style/Theme.Holo.Light.Dialog">
    <item name="android:listChoiceIndicatorMultiple">@drawable/btn_check</item>
    <item name="android:background">#aaf</item>
</style>

Я обнаружил это, посмотрев исходный код Android и обнаружив, что шаблон, используемый для элементов с несколькими вариантами в диалоговом окне, следующий:

https://github.com/android/platform_frameworks_base/blob/master/core/res/res/layout/select_dialog_multichoice_holo.xml

Ответ 2

Все, что вы ищете, можно найти в разделе Темы и стили из документов и применить атрибуты вашей темы с найденными атрибутами в Android attrs docs

Чтобы сделать это легко, следуйте этому примеру:

<style name="myTheme" parent="@android:Theme.Holo">
    <!-- override default check box style with custom checkBox -->
    <item name="android:checkBoxStyle">@style/CustomCheckBox</item>

</style>
<style name="CustomCheckBox" parent="@android:style/Widget.CompoundButton.CheckBox">
<item name="android:button">@drawable/btn_check</item>
<item name="android:textColor">@android:color/holo_purple</item>

Теперь, если для параметра "myTheme" установлено значение "Активность", у вас есть пользовательский флажок;)

Надеюсь, это поможет, счастливое кодирование!

Ответ 3

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

1 > сделайте два файла png для отмеченных и непроверенных состояний cb, как вы того захотите, и сохраните их в выпадающей папке вашего приложения.

2 > теперь создайте один файл customdrawble.xml, как показано ниже:

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

3 > сделайте свой флажок ниже:

<CheckBox
    android:id="@+id/chk"
    android:button="@drawable/customdrawable"
    android:layout_alignParentLeft="true"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

решение работало для меня, чтобы изменить отображение для одного флажка