6

我正在开发一个应用程序,它将为不同的客户使用不同的颜色和图像。虽然我可以选择在构建时使用自定义颜色重新编写 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 中更改 and 的值,headercolorbackgroundColor让它在使用这些值的所有视图中发生吗?或者,每当我显示这些视图时,我是否必须单独更改每个相关的视图颜色?

提前致谢。

4

2 回答 2

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 辅助函数。如果只设置一两个地方,那可能没什么大不了的。同样,知道您为什么要这样做而不是询问我们如何做,可能会为您提供更好的选择。

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

于 2013-06-24T18:09:22.997 回答
0

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

于 2013-06-25T15:44:45.767 回答