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

时间:2013-06-24 17:14:25

标签: android android-layout colors

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

换句话说,如果我有:

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

和布局文件类似:

<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中更改headercolorbackgroundColor的值,并将其发生在使用这些值的所有视图中吗?或者,每当我显示这些视图时,我是否必须单独更改每个相关的视图颜色?

提前致谢。

2 个答案:

答案 0 :(得分:1)

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

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

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;
}

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

但是,要允许它在XML设置和/或开发布局预览中工作,您必须编写自定义视图类来调用该帮助程序函数。根据您使用此颜色的位置和方式,可能不值得。

这个解决方案不是很优雅,需要在每个需要它的活动/片段中调用这个自定义的getMyColor辅助函数。如果它只设置了一两个地方,那可能不是什么大问题。再一次,知道为什么你想要这样做而不是问我们如何做到这一点,可能会为你提供更好的选择。

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

答案 1 :(得分:0)

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