我是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>
答案 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)
您可以实现目标的唯一方法是定义两种不同的颜色,例如blah
和blah2
,并在主题中引用它
答案 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>
最好的注册!