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

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

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.


Обновление:

Теперь, согласно ответу 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>

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


person yprez    schedule 25.01.2014    source источник


Ответы (3)


На самом деле вызов 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

person mikeplate    schedule 29.01.2014
comment
То же самое, индивидуальный фон CustomCheckedTextView и другие элементы могут быть изменены CustomCheckedTextView, но не флажки... - person yprez; 29.01.2014
comment
да. У меня было время самому создать пример проекта и я могу изменить фон CheckedTextView в стиле. К сожалению, установка галочки на меня тоже не влияет. Я заметил, что для checkedTextViewStyle требуется уровень API 17 (4.2), но вы правы? - person mikeplate; 29.01.2014
comment
Только что обновил свои выводы в ответе после обнаружения атрибута listChoiceIndicatorMultiple. Я протестировал его, и он работает. - person mikeplate; 29.01.2014

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

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

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

Now, as long as "myTheme" is set to Activity, you have a custom check box ;)

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

person MattMatt    schedule 26.01.2014
comment
Спасибо, я попробовал это... Это влияет на флажки, указанные в макете активности, но не на те, что в диалоговом окне. Есть идеи? - person yprez; 26.01.2014
comment
Попробуйте также настроить темы для диалогов, поищите это в документах, на которые я ссылался. В вашей теме должно быть что-то вроде <item name="android:dialogStyle">@style/myCustomDialog</item>. Тогда фактический стиль должен быть <style name="myCustomDialog" parent="@android:style/Widget.DeviceDefault.Dialog> <!-- customize your dialog here --> </style> - person MattMatt; 26.01.2014
comment
android:dialogStyle нет, но мне удалось установить собственный стиль в конструкторе с помощью: new AlertDialog.Builder(new ContextThemeWrapper(this, R.style.CustomDialog));. Но знаете что, пользовательский стиль диалога влияет на все остальные свойства, но не на флажки... - person yprez; 27.01.2014
comment
Извините, вы правы, атрибута android:dialogStyle нет. Это атрибут android:dialogTheme. Все атрибуты можно найти на странице developer.android.com/reference/android/. R.attr.html , чтобы упростить задачу, обычно ctrl + f ищет текст на этой странице. просто диалоговое окно поиска или флажок - person MattMatt; 28.01.2014
comment
Спасибо. Кажется, я почти у цели. Но стиль флажка по-прежнему не применяется. Например. Я могу изменить цвет фона диалогового окна, но флажки не затрагиваются... - person yprez; 28.01.2014
comment
Хммм, поначалу создание тем может быть проблемой, я только что сделал свою первую на днях. Убедитесь, что вы включили все стили в свою базовую тему. Прочитайте/ищите документы, на которые я ссылался выше, и это лучшее, что у меня есть. Извините, я не мог больше помочь... Должно работать, если вы переопределяете базовый стиль своими стилями в своей теме. - person MattMatt; 28.01.2014

вы можете установить чертежи для всех состояний флажков. 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" />

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

person karan    schedule 28.01.2014
comment
Я думаю, вам следует перечитать мой вопрос. У меня уже есть собственный стиль, который я могу применить к одному флажку или ко всей теме. Проблема возникает, когда я пытаюсь настроить флажки в диалоговом окне предупреждения. - person yprez; 28.01.2014