Android 如何以编程方式更改colors.xml中颜色的值?

Android 如何以编程方式更改colors.xml中颜色的值?,android,android-layout,colors,Android,Android Layout,Colors,我正在开发一个应用程序,将为不同的客户以不同的颜色和图像为主题。虽然我可以选择在构建时使用自定义颜色重新编写colors.xml文件,但我倾向于在运行时设置颜色。我想知道的是,这是否是一种以编程方式更改colors.xml文件中定义的颜色值的方法,并使该新值在布局定义中使用的所有位置生效 换句话说,如果我有: <?xml version="1.0" encoding="UTF-8"?> <resources> <color headerColor="whit

我正在开发一个应用程序,将为不同的客户以不同的颜色和图像为主题。虽然我可以选择在构建时使用自定义颜色重新编写colors.xml文件,但我倾向于在运行时设置颜色。我想知道的是,这是否是一种以编程方式更改colors.xml文件中定义的颜色值的方法,并使该新值在布局定义中使用的所有位置生效

换句话说,如果我有:

<?xml version="1.0" encoding="UTF-8"?>
<resources>
    <color headerColor="white">#FFF</color>
    <color backgroundColor="black">#000</color>
</resources>

#FFF
#000
以及具有以下内容的布局文件:

<TextView
        android:id="@+id/listItemHeaderActivity"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textSize="12sp"
        android:textColor="@color/headerColor"
        android:background="@color/backgroundColor"
        android:text="@string/listTextHeaderActivity"/>

我是否可以在Java中更改
headercolor
backgroundColor
的值,并在使用这些值的所有视图中进行更改?或者,无论何时显示这些视图,我都必须单独更改每个相关视图的颜色吗


提前感谢。

如果您描述了为什么以及如何使用此动态颜色,以及为什么希望在运行时而不是在构建时执行此操作,将会有所帮助。但假设这是你要求的方式

我建议编写一个helper函数,所有地方都可以调用并设置它们

public int getMyColor(...) {
    // figure out which color to use, via a database call,
    // an asset load, some algorithm, or whatever you need
    ...

    // once color chosen, create an RGBA integer for it
    final int myColor = ...

    return myColor;
}
现在对每个需要它的活动/片段调用它,并根据需要在适当的视图上设置颜色属性。(带有
视图.setBackgroundColor(…)
等)

但是,要使其在XML设置和/或开发布局预览中工作,您还必须编写一个自定义视图类来调用该助手函数。取决于你将在何处以及如何使用这种颜色,它可能不值得

这个解决方案不是很优雅,需要在每个需要它的活动/片段中大量调用这个定制的getMyColor助手函数。如果只设定了一两个位置,那可能没什么大不了的。同样,了解您为什么要这样做而不是问我们如何做,可能会为您提供更好的选择


例如,这不是你问题的答案,但你有没有想过主题?它仍然存在在构建时设置它们的问题,除非您需要以上所有内容,但根据您使用这种颜色的方式,它可能比我上面概述的混乱要好。

我最终做了一些类似于Jon所描述的事情。我创建了一个类扩展片段(在我的例子中是SherlockFragment)。该类有一个名为“setCustomColors”的新方法,该方法只获取片段视图并搜索其所有子类以查找需要自定义的特定类型的视图。然后,我为所有片段扩展了该类,并在onCreateView方法中调用函数,传入当前片段视图。如果这个解释不清楚,请告诉我(尽管这可能不是很多人都会遇到的问题)。

您尝试了什么?在这一点上,除了定义一些默认颜色值并在布局文件中使用它们之外,我还没有真正尝试过其他方法,如您所见。我一直无法找到一种方法来做我在问题中描述的事情,所以我还没有尝试过类似的事情。不,你不能改变。您可以使用SharedReferences保存颜色并使用它们。我认为这是不可能的。你不能。。。我能想到的唯一一件事是android提供的普通主题化功能。我们的团队决定我们不想在构建时这样做,因为他们不喜欢在colors.xml文件中复制颜色值时需要的有点混乱的脚本。此外,我们希望配置尽可能独立于构建,以便我们只需要提供一个商户设置文件。您可以将大部分应用程序视为共享库,然后让“真实”应用程序的每个商户实例覆盖colors.xml文件。有关更多信息,请参阅。这最终将需要多个“一个商户设置文件”,但将解决问题,并成为每个Android SDK设计的“受支持”解决方案。