В темах Android возникают проблемы с реализацией самого простого: настраиваемый цвет для каждой темы

Я новичок в разработке для Android, и, хотя кодирование имеет смысл, темы для Android, ИМХО, не подходят.

У меня возникли проблемы с реализацией этой простой задачи:

У меня есть (например) цвет с именем "blah"

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <color name="blah">#F0F0F0</color>
<resources>

который используется везде в XML-макетах или коде, а также в различных компонентах представления как "@color/blah"

Я просто хотел бы сделать это изменение значения цвета для каждой темы

Поэтому, когда я использую MyTheme1, blah должен быть #F0F0F0, а когда я использую MyTheme2, blah должен быть #00FF00.

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

Спасибо заранее

ОБНОВЛЕНИЕ:

После ссылки, предоставленной Mohamed_AbdAllah, мне удалось создать несколько пользовательских цветов, определив их в attrs.xml и styles.xml:

attrs.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <attr name="color_item_title" format="color|reference" />
</resources>

styles.xml

<style name="AppBaseThemeDark" parent="android:Theme.Black">
<item name="color_item_title">@color/White</item>                      
</style>

Но теперь возникает гораздо более серьезная проблема

Я могу успешно использовать цвет ?color_item_title в каждом представлении, поэтому кнопки и текст фактически получают этот цвет.

Но использование этого ?color_item_title в пользовательских чертежах или макетах списка (ЭТО ПРЕДСТАВЛЕНИЯ, КОТОРЫЕ РАЗДУВАЮТСЯ ВО ВРЕМЯ ВЫПОЛНЕНИЯ) вызывает сбой.

Таким образом, использование ?color_item_title внутри макета списка listview приводит к сбою во время выполнения с сообщением надувания в этой строке :(

Он также дает сбой на моих чертежах: (опять ошибка инфляции)

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >

<solid android:color="@color/Black" />
<corners
    android:bottomLeftRadius="8dp"
    android:bottomRightRadius="8dp"
    android:topLeftRadius="8dp"
    android:topRightRadius="8dp" />
 <stroke android:width="1dp" android:color="?color_item_title" />
</shape>

person John S    schedule 19.05.2013    source источник
comment
проверьте этот вопрос   -  person Mohamed_AbdAllah    schedule 19.05.2013
comment
Хотя ваша ссылка помогла, возникла более серьезная проблема, поэтому я обновил свой пост.   -  person John S    schedule 20.05.2013


Ответы (3)


После поисков и попыток я получил совет, что есть вещи, которые вы можете сделать, и некоторые вещи, которые вы не можете.

Вы можете

а) Определите свои собственные атрибуты в attrs

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <attr name="color_gallery_backround" format="color|reference" />
</resources>

б) Установите их значения в файле styles.xml.

<style name="AppBaseThemeDark" parent="android:Theme.Black">
           <item name="color_gallery_backround">@color/White</item>              
 </style>
 <style name="AppBaseThemeWhite" parent="android:Theme.Light">
           <item name="color_gallery_backround">@color/Black</item>              
 </style>

c) Используйте их в любом представлении, например, как ?color_gallery_backround или ?attr/color_gallery_backround.

android:background="?attr/color_gallery_backround"

ВЫ НЕ МОЖЕТЕ

а) Вы не можете получить доступ к этому атрибуту из пользовательских рисунков, так как они недействительны во время инфляции

поэтому вы не можете использовать ?attr/color_gallery_backround здесь:

customshape.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >

<solid android:color="**?attr/color_gallery_backround**" />
 <stroke android:width="2dp" android:color="@color/Black" />
</shape>

б) Вы не можете получить доступ к этому атрибуту в представлении, которое будет раздуто во время (например) ListView как представление ListItem

Таким образом, «поддержка» темы для атрибутов, по крайней мере, до API 10 имеет ограничения по глубине.

Решения

Как было предложено, вам нужно создать ДВА отдельных чертежа, используя разные цвета, и настроить атрибуты для ссылки на эти чертежи в соответствии с темой:

attrs.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <attr name="rounded_background" format="reference" />   
</resources>

и для каждой темы настройте, какие фактические возможности рисования использовать в styles.xml:

<resources>

    <style name="AppBaseThemeDark" parent="android:Theme.Black">
           <item name="rounded_background">@drawable/round_rect_shape_dark</item>    
           </style>

    <style name="AppBaseThemeLight" parent="android:Theme.Light">
           <item name="rounded_background">@drawable/round_rect_shape_white</item>     
           </style>

</resources>

Теперь вы можете ссылаться на свой рисунок как ?rounded_background и позволить теме выбрать его.

Для расширенных представлений внутри макетов элементов списка ListView необходимо программно установить цвета.

person John S    schedule 19.05.2013

Единственный способ добиться желаемого — определить два разных цвета, например, blah и blah2, и указать их в своих темах.

person Blackbelt    schedule 19.05.2013

Это работает для меня, как предложил Джон С, но в определении атрибутов мне пришлось добавить «цвет | ссылка» вместо просто «ссылка». Итак, мой файл attrs.xml выглядит так:

<?xml version="1.0" encoding="utf-8"?>
    <resources>
        <attr name="rounded_background" format="color|reference" />   
    </resources>

Лучшие регады!

person lgallard    schedule 13.01.2015