2013-05-19 30 views
8

我在Android开发初学者,虽然编码熟能生巧SENCE,安卓主题恕我直言不Android的主题实现最简单的麻烦:每个主题颜色定制

我实现这个简单的任务麻烦:

我已(例如)颜色名为“嗒嗒”

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

其到处用于XML布局或代码,并通过不同的视图complonents为“@颜色/嗒嗒”

我只是想使每个主题此颜色值变化

所以,当我使用MyTheme1,等等应该是#F0F0F0,当我使用MyTheme2等等应该是#00FF00

我一直在读关于主题,仍然无法找到如何实现这个简单的任务,因为我的应用程序不需要特殊的风格等,只是每个主题的颜色。

提前感谢名单

UPDATE:

由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在里面运行 列表视图列表项的布局崩溃,并在该行:(

它还崩溃在我的绘图资源吹气消息:(再次通货膨胀错误)

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

检查这个[问题](http://stackoverflow.com/questions/8630694/theme-dependent-colors-of-selected-widgets) –

+0

虽然你的链接提供了帮助,但更严重的问题出现了,所以我更新了我的文章 –

回答

0

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

3

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

您可以

一)定义自己的属性在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)您不能访问从自定义可绘制此属性,因为他们在 通货膨胀是无效的

所以你在这里不能使用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具有深度的限制。

解决方案

至于建议,你必须创建使用不同颜色的两个单独的图形内容,并设置属性根据主题引用这些绘项目:

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> 

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

对于ListView listitem布局内的充气视图,您必须以编程方式设置颜色。

0

它适用于我的约翰S建议,但在属性定义中,我不得不添加“颜色参考”而不是“参考”。所以我的attrs.xml文件看起来像这样:

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

Best Regads!