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

Roc*_*uy3 6 android colors android-layout

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

换句话说,如果我有:

<?xml version="1.0" encoding="UTF-8"?>
<resources>
    <color headerColor="white">#FFF</color>
    <color backgroundColor="black">#000</color>
</resources>
Run Code Online (Sandbox Code Playgroud)

和一个布局文件,如:

<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"/>
Run Code Online (Sandbox Code Playgroud)

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

提前致谢.

Jon*_*ams 1

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

\n\n

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

\n\n
public int getMyColor(...) {\n    // figure out which color to use, via a database call,\n    // an asset load, some algorithm, or whatever you need\n    ...\n\n    // once color chosen, create an RGBA integer for it\n    final int myColor = ...\n\n    return myColor;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在在每个需要它的活动/片段上调用它,并根据需要在适当的视图上设置颜色属性。(与View.setBackgroundColor(...)等)

\n\n

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

\n\n

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

\n\n

例如\xe2\x80\x94这不是您问题的答案\xe2\x80\x94但是您考虑过主题吗?它仍然存在必须在构建时设置它们的问题,除非您想要上述所有内容,但根据您如何使用这种颜色,它可能比我上面概述的混乱更好。

\n