Android主题无法实现最简单的:自定义每个主题颜色

时间:2013-05-19 10:40:09

标签: android android-layout themes android-theme

我是Android开发的初学者,虽然编码很有意义,但android主题恕我直言

我无法实现这个简单的任务:

我有(例如)一种名为“blah”的颜色

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

在XML布局或代码中随处可见,并且由不同的视图组件用作“@ color / blah”

我只想让每个主题的颜色值更改

所以当我使用MyTheme1时,blah应该是#F0F0F0,当我使用MyTheme2时,应该是#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, 所以按钮和文字实际上就是那种颜色。

但是在自定义drawables或listview布局上使用?color_item_title (这是在运行时间充气的观点)导致崩溃。

因此在listview listitem布局中使用?color_item_title会崩溃 运行时在该行有一个inflater消息:(

它也在我的drawables崩溃:(再次出现通货膨胀错误)

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

3 个答案:

答案 0 :(得分:3)

经过搜索和尝试,我得到的提示是,你可以做一些事情,并且你不能做的事情

您可以

a)在attrs中定义自己的属性

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

b)在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"

你不能

a)您无法从自定义drawable中访问此属性,因为它们在期间无效 充气

所以你不能在这里使用?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>

b)您无法在视图中访问此属性(例如) ListView作为ListItem视图

因此,对于至少属于API 10的属性,主题“支持”具有深度限制。

<强>解决方案

根据建议,您必须使用不同颜色创建两个单独的drawable,并根据主题设置属性以引用这些drawable:

attrs.xml

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

并在每个主题上设置要在styles.xml中使用的实际drawable:

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

现在你可以将你的drawable引用为?rounded_background并让主题选择它。

对于ListView listitem布局中的膨胀视图,您必须以编程方式设置颜色。

答案 1 :(得分:0)

您可以实现目标的唯一方法是定义两种不同的颜色,例如blahblah2,并在主题中引用它

答案 2 :(得分:0)

对于我来说,正如John S建议的那样,但在属性定义中,我必须添加“color | reference”而不仅仅是“reference”。所以我的attrs.xml文件如下所示:

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

最好的注册!