8

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

样式.xml

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

但是现在出现了一个更严重的问题

我可以在每个视图中成功使用颜色 ?color_item_title,因此按钮和文本实际上会获得该颜色。

但是在自定义可绘制对象或列表视图布局上使用该 ?color_item_title (即在运行时获得膨胀的视图)会导致崩溃。

因此,在 listview listitem 布局中使用 ?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>
4

3 回答 3

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) 您无法从自定义可绘制对象访问此属性,因为它们在膨胀期间无效

所以你不能在这里使用 ?attr/color_gallery_backround :

自定义形状.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>

现在您可以将您的可绘制对象引用为 ?rounded_background 并让主题选择它。

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

于 2013-05-19T21:49:18.833 回答
0

正如 John S 建议的那样,它对我有用,但在属性定义中我必须添加“颜色|参考”而不仅仅是“参考”。所以我的 attrs.xml 文件如下所示:

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

最好的问候!

于 2015-01-13T15:50:25.640 回答
0

你可以实现你想要的唯一方法是定义两种不同的颜色,blah例如blah2,在你的主题中引用它

于 2013-05-19T10:49:03.977 回答