安卓主题 - 在自定义主题中定义颜色

28
我相信这个问题有一个简单的答案,但我找不到它,所以我来到stackoverflow寻求帮助... ;-)
我将用一个例子来说明。我有一个安卓应用程序,用户可以在偏好设置中选择主题-暗色或亮色主题。根据所选的主题,我必须调整我的应用程序中的20种颜色。因此,我希望能够在主题中定义颜色,然后在我的TextView等控件中使用这些颜色的名称。但是到目前为止,我无法找到如何实现这一点的方法,并且在这里和那里都找不到任何解决方案。我真的不想为这20种颜色的每一种定义额外的暗色和亮色样式,但到目前为止,这似乎是我能找到的唯一解决方案。
非常感谢任何提示
马丁:
更新:
在伪语法中,这就是我正在寻找的。这可能吗?
<style name="AppTheme.MyDark" parent="android:Theme">
  -?-> titleColor = "#ffffff"
  -?-> introColor = "#ffaaaa"  
</style>

<style name="AppTheme.MyLight" parent="android:Theme.Light">
  -?-> titleColor = "#000000"
  -?-> introColor = "#004444"  
</style>


<TextView
        android:id="@+id/quoteTitle"
        android:textColor=@titleColor
        ...
</TextView>

<TextView
        android:id="@+id/quoteIntro"
        android:textColor=@introColor
        ...
</TextView>

您可以在应用程序中使用样式和主题来实现相同的效果。这里有一个非常好的教程,介绍如何使用它们:http://mobileorchard.com/android-app-development-using-themes-and-styles-in-android/ - Anup Cowkur
谢谢,但是根据我的例子,我必须定义20x2个样式来覆盖与主题有关的20种颜色。对吗?我找到的这个解决方案是否如上所述,或者您能否给我一个更优雅的示例? - dorjeduck
这个就像CSS一样工作。你可以有一个父样式,抽象出所有子样式共享的属性。然后,对于每个子样式,你只需更改颜色和元素特定的属性(比如高度、宽度等)。然后,你可以将它们封装在一个主题中,并为另一个主题做同样的操作。这是最优雅的方式,因为它被设计成模仿CSS样式格式,以便网页开发人员和设计师能够轻松切换到Android平台。 - Anup Cowkur
非常感谢 - 我只是在我的问题中放了伪代码来解释我所寻求的。如何将其翻译为正确的 Android 样式语法的代码,并保持紧凑的形式,类似于伪代码? - dorjeduck
1个回答

93

我找到了一个看起来可行的解决方案。首先,您需要在attr.xml中定义自定义颜色字段。

<?xml version="1.0" encoding="utf-8"?>
<resources>

<attr name="titleColor" format="reference|color" />
<attr name="introColor" format="reference|color" />

</resources>

接下来您定义主题

<style name="AppTheme.MyDark" parent="android:Theme">
   <item name="titleColor">#FFFFFF</item>
   <item name="introColor">#FFFFFF</item>
</style>


<style name="AppTheme.MyLight" parent="android:Theme">
   <item name="titleColor">#000000</item>
   <item name="introColor">#004444</item>
</style>

最后,在您的布局中加入以下内容。

<TextView
    android:id="@+id/quoteTitle"
    android:textColor="?titleColor"
    ...
</TextView>

<TextView
    android:id="@+id/quoteIntro"
    android:textColor="?introColor"
    ...
</TextView>

主要解决方案在这里

官方Android文档似乎没有关于使用属性的解释。我发现的最好的资源在这里


1
这正是我在寻找的,对于“?”加一分(我不知道我们可以使用“?”来缩写“?attr/”)。 - Ninja Coding
谢谢!我只想使用primary/primaryDark/accent颜色。所以根据你的回答,我得出了只需使用?colorPrimary/?colorPrimaryDark/?colorAccent。 - SammyT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接