如何将颜色资源作为参数传递 (Android)

How to pass color resource as parameter (Android)

这可能是有史以来最简单的事情,但对于我来说,我还没有弄明白。

我有一个设置布局背景颜色的方法,但我想像处理可绘制资源一样将颜色作为参数传递。例如

public void setIcon (Drawable icon){
  this.icon = context.getResources().getDrawable(icon);
}

setIcon(R.drawable.tuborg);

我希望能够用 color (R.color.id) 做一些类似的事情。我试过了

public void setColor (Color color){
  layout.setBackgroundColor(context.getResources().getColor(color));
}

public void setColor (Color color){
  layout.setBackgroundColor(ContextCompat.getColor(color));
}

两者都要求int,即使(int color)也不起作用。另外,我试图避免 Color.parse().

这就是我使用函数的方式

setColor(R.color.colorAccent);

我有一个带有各种颜色代码的 xml。我希望能够调用此函数并更改背景颜色。

您需要一个颜色资源 ID。它以 R.color 开头,它实际上是一个 整数 id.

public void setColor (@ColorInt int colorId){ // integer id 
  layout.setBackgroundColor(ContextCompat.getColor(colorId));
}

更新

尽管您像 setColor(R.color.colorAccent) 一样使用它,但您的 函数参数 仍然需要 color 例如

setColor (Color color)

。您需要将函数参数类型更新为 int,就像我在上面的代码片段中所做的那样。

setColor (int color)

也来自 ContextCompat.getColor 的文档。

Returns a color associated with a particular resource ID.Starting in {@link android.os.Build.VERSION_CODES#M}, the returned color will be styled for the specified Context's theme.

@param id The desired resource identifier, as generated by the aapt tool. This integer encodes the package, type, and resource entry. The value 0 is an invalid identifier.

@return A single color value in the form 0xAARRGGBB.

首先,您似乎在尝试设置 View 的属性,这不是 Java 中存在的概念。所以你真正想要的是:

layout.setBackgroundColor(context.getResources().getColor(R.color.colorRes));

View#setBackgroundColor() 需要格式为 #AARRGGBB 的颜色整数,其中

A = 阿尔法 R = 红色 G = 绿色 B = 蓝色。

所以要设置纯红色,你可以这样做:

layout.setBackgroundColor(0xFFFF0000);

纯蓝色:

layout.setBackgroundColor(0xFF0000FF);

纯绿色:

layout.setBackgroundColor(0xFF00FF00);

对于Resources#getColor(int);,需要一个您想要的颜色的资源ID。在这种情况下,您可以将 colors.xml 放入项目的 res/values 文件夹中。然后有这样的东西:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#3F51B5</color>
</resources>

然后你可以像这样检索颜色:

int color = context.getResources().getColor(R.color.colorPrimary);

或者如果您 API 23 或更高:

int color = context.getColor(R.color.colorPrimary);

或者更简单的ContextCompat方法:

int color = ContextCompat.getColor(R.color.colorPrimary);

然后你可以像这样设置背景颜色:

view.setBackgroundColor(color);

最后,如果您不想做任何这些,您可以直接在视图上设置它,如下所示:

view.setBackgroundResource(R.color.colorPrimary);

你可以试试这个:

public void setColor (int colorId){
  layout.setBackgroundColor(ContextCompat.getColor(colorId));
}

在该方法中,colorId 应该是颜色的六进制代码

一个好的做法是在 colors.xml(值文件夹内)上定义颜色。

<?xml version="1.0" encoding="UTF-8"?>
<resources>
    <color name="red">#FF0000</color>
</resources>

在这种情况下,您将像这样使用此函数:

setColor(R.color.red);

因此,无需创建 "color" 对象,您可以从 colors.xml

传递值

此外,在您的情况下,您应该将方法 setColor(Color aColor) 修改为 setColor(int aColor) 以使其与 xml 颜色资源一起使用。