Вопрос по android-layout, android, checkbox – Стиль флажка Android

39

Я новичок в Android, и я пытаюсь установить стиль для всех флажков в моем приложении. Мой стиль приложения установлен на Theme.Holo, который темный, и я хотел бы, чтобы флажки в моем представлении списка имели стиль Theme.Holo.Light. Я не пытаюсь создать собственный стиль. Код ниже, похоже, не работает, ничего не происходит вообще. Мне нужно сделать это, потому что мой вид списка имеет текстуру светлой бумаги и флажок и текст флажка белого цвета, который я хотел бы темного цвета.

<code><style name="CustomActivityTheme" parent="@android:style/Theme.Holo">
    <item name="android:checkboxStyle">@style/customCheckBoxStyle</item>
</style>

<style name="customCheckBoxStyle" parent="@android:style/Widget.Holo.Light.CompoundButton.CheckBox">
</style>
</code>

Также вы можете установить стили для отдельных виджетов, если вы установите стиль для приложения?

Ваш Ответ

5   ответов
116

Note: Использовать библиотеку поддержки Android v22.1.0 и использовать API уровня 11 и выше? Прокрутите вниз до последнего обновления.

My application style is set to Theme.Holo which is dark and I would like the check boxes on my list view to be of style Theme.Holo.Light. I am not trying to create a custom style. The code below doesn't seem to work, nothing happens at all.

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

Во-первых, давайте посмотрим, чтоWidget.Holo.Light.CompoundButton.CheckBox стиль определяет. Чтобы сделать вещи более понятными, я также добавил «обычный». (не светлое) определение стиля.

<style name="Widget.Holo.Light.CompoundButton.CheckBox" parent="Widget.CompoundButton.CheckBox" />

<style name="Widget.Holo.CompoundButton.CheckBox" parent="Widget.CompoundButton.CheckBox" />

Как видите, оба являются пустыми объявлениями, которые просто переносятсяWidget.CompoundButton.CheckBox под другим именем. Итак, давайте посмотрим на этот родительский стиль.

<style name="Widget.CompoundButton.CheckBox">
    <item name="android:background">@android:drawable/btn_check_label_background</item>
    <item name="android:button">?android:attr/listChoiceIndicatorMultiple</item>
</style>

Этот стиль ссылается как на фон, так и на кнопку.btn_check_label_background просто 9-патч и, следовательно, не очень интересный в этом вопросе. Тем не мение,?android:attr/listChoiceIndicatorMultiple указывает на то, что некоторый атрибут основан наcurrent theme (это важно понимать) будет определять фактический видCheckBox.

КакlistChoiceIndicatorMultiple является атрибутом темы, вы найдете несколько объявлений для него - по одному для каждой темы (или ни одного, если оно унаследовано от родительской темы). Это будет выглядеть следующим образом (с другими атрибутами для ясности опущено):

<style name="Theme">
    <item name="listChoiceIndicatorMultiple">@android:drawable/btn_check</item>
    ...
</style>

<style name="Theme.Holo">
    <item name="listChoiceIndicatorMultiple">@android:drawable/btn_check_holo_dark</item>
    ...
</style>

<style name="Theme.Holo.Light" parent="Theme.Light">
    <item name="listChoiceIndicatorMultiple">@android:drawable/btn_check_holo_light</item>
    ...
</style>

Так вот где происходит настоящее волшебство: на основе темыlistChoiceIndicatorMultiple атрибут, фактическое появлениеCheckBox определен. Явление, которое вы видите, теперь легко объяснимо: поскольку внешний вид основан на темах (иnot на основе стиля, потому что это просто пустое определение), и вы наследуете отTheme.Holo, вы всегда получитеCheckBox внешний вид, соответствующий теме.

Теперь, если вы хотите изменить свойCheckBoxПо сравнению с версией Holo.Light, вам потребуется взять копию этих ресурсов, добавить их в свои локальные ресурсы и использовать собственный стиль для их применения.

Что касается вашего второго вопроса:

Also can you set styles to individual widgets if you set a style to the application?

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

Is there any way to set a theme(style with images) to the checkbox widget. (...) Is there anyway to use this selector: link?

Update:

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

Тем не менее, способ получить доступ к системным ресурсам, в конце концов, путем поиска идентификатора по имени. Рассмотрим следующий фрагмент кода:

int id = Resources.getSystem().getIdentifier("btn_check_holo_light", "drawable", "android");
((CheckBox) findViewById(R.id.checkbox)).setButtonDrawable(id);

Первая строка на самом деле возвращает идентификатор ресурсаbtn_check_holo_light рисованный ресурс. Так как мы установили ранее, что это кнопка выбора, которая определяет внешний видCheckBoxмы можем установить его как «кнопку, которую можно рисовать»; на виджете. Результатом являетсяCheckBox с появлениемHolo.Light версия, независимо от того, какую тему / стиль вы задаете для приложения, действия или виджета в XML. Так как это устанавливает только кнопку для рисования, вам нужно будет вручную изменить другой стиль; например относительно внешнего вида текста.

Ниже скриншот, показывающий результат. Верхний флажок использует метод, описанный выше (я вручную устанавливаю черный цвет текста в xml), в то время как второй использует стандартную тему на основеHolo стайлинг (то есть не светлый).

Screenshot showing the result

Update2:

Свведение библиотеки поддержки v22.1.0, все стало намного проще! Цитата из заметок о выпуске (мой акцент):

Lollipop added the ability to overwrite the theme at a view by view level by using the android:theme XML attribute - incredibly useful for things such as dark action bars on light activities. Now, AppCompat allows you to use android:theme for Toolbars (deprecating the app:theme used previously) and, even better, brings android:theme support to all views on API 11+ devices.

Другими словами: теперь вы можете применить тему кper-view основа, которая значительно облегчает решение исходной задачи: просто укажите тему, которую вы хотите применить для соответствующего представления. То есть в контексте исходного вопроса сравните результаты ниже:

<CheckBox
    ...
    android:theme="@android:style/Theme.Holo" />

<CheckBox
    ...
    android:theme="@android:style/Theme.Holo.Light" />

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

Конечно, вы больше не должны использовать тему Holo, а вместо этого использовать материал.

@MH. отлично сработано.
Спасибо, что нашли время ответить. Я вижу проблему здесь, и я все еще задаюсь вопросом, можно ли это сделать без необходимости выполнять большую работу. Есть ли способ установить тему (стиль с изображениями) для виджета флажка. Я знаю, что могу найти изображения и включить их в свой проект, но это похоже на убийство. Есть ли в любом случае использовать этот селектор:github.com/android/platform_frameworks_base/blob/master/core/… user1330739
@ user1330739: Да и нет. Вы не должны полагаться на внутренние ресурсы, так как Google может решить изменить их в будущих выпусках. Включение копии Drawables в ваши местные ресурсы действительно ваш лучший вариант. При этом есть другое (безобразное) решение, о котором я знаю, но оно работает только во время выполнения (то есть вы не можете ссылаться на него в своих XML-файлах). Пожалуйста, смотрите редактирование моего ответа выше.
21

Стиль :

<style name="MyCheckBox" parent="Theme.AppCompat.Light">  
    <item name="colorControlNormal">@color/foo</item>
    <item name="colorControlActivated">@color/bar</item>
</style>  

Макет:

<CheckBox  
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:checked="true"
    android:text="Check Box"
    android:theme="@style/MyCheckBox"/>

Это сохранит анимацию материала на Lollipop +.

Имеет смысл сделать это так. Есть ли способ глобально установить тему для флажка тогда?
56

something.xml

<CheckBox
    android:text="Custom CheckBox"
    android:button="@drawable/checkbox_selector"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

Selector

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

Для ссылки просто обратитесьВот

1

<selector>...</selector> Вам может понадобиться:

<item android:state_pressed="true" android:drawable="@drawable/checkbox_pressed" ></item>
4

<style name="CustomActivityTheme" parent="@android:style/Theme.Holo">
    <item name="android:checkboxStyle">@style/customCheckBoxStyle</item>
</style>

<style name="customCheckBoxStyle" parent="@android:style/Widget.CompoundButton.CheckBox">
    <item name="android:textColor">@android:color/black</item>
</style>

Обратите внимание, элемент textColor.

Похожие вопросы