it-swarm.com.ru

Стиль флажка Android

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

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

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

39
user1330739

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


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

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

Сначала давайте посмотрим, что определяет стиль 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 указывает, что некоторый атрибут, основанный на текущая тема (это важно понимать), будет определять фактический внешний вид 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. Явление, которое вы видите, теперь легко объяснимо: поскольку внешний вид основан на теме (и не на основе стиля, потому что это просто пустое определение), и вы наследуете от Theme.Holo, вы всегда будете получить внешний вид CheckBox, соответствующий теме.

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

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

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

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

Есть ли способ установить тему (стиль с изображениями) на флажок виджет. (...) Есть ли способ использовать этот селектор: ссылка ?


Обновление:

Позвольте мне начать с повторения, что вы не должны полагаться на внутренние ресурсы 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 добавлена ​​возможность перезаписывать тему в представлении по уровню представления с помощью атрибута XML Android:theme - невероятно полезно для таких вещей, как темные панели действий на светлых действиях. Теперь AppCompat позволяет использовать Android:theme для панелей инструментов (устарел app:theme, использовавшийся ранее) и что еще лучше, обеспечивает поддержку Android:theme для всех представлений на устройствах API 11+.

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

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

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

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

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

116
MH.

Может быть, это удовлетворит вас - 

thing.xml

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

Селектор

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

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

56
Praveenkumar

Правильный способ сделать это для Материального дизайна: 

Стиль :

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

21
Rémy DAVID

Возможно, вы хотите что-то вроде:

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

4
Edwin Evans

В предыдущем ответе также в разделе <selector>...</selector> вам может понадобиться:

<item Android:state_pressed="true" Android:drawable="@drawable/checkbox_pressed" ></item>
0
Alex Che