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

时间:2016-11-23 18:34:16

标签: java android android-linearlayout background-color

这可能是最简单的事情,但对于我的生活,我还没有想到它。

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

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。我希望能够调用此函数并获得背景颜色更改。

3 个答案:

答案 0 :(得分:5)

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

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

<强>更新

尽管您使用的是setColor(R.color.colorAccent),但您的功能参数仍需要color,例如int

  

setColor(颜色颜色)

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

  

setColor( int 颜色)

同样来自 public static void PrintTree<T>(T rootNode, Func<T, string> nodeLabel, Func<T, List<T>> childernOf) { var firstStack = new List<T>(); firstStack.Add(rootNode); var childListStack = new List<List<T>>(); childListStack.Add(firstStack); while (childListStack.Count > 0) { List<T> childStack = childListStack[childListStack.Count - 1]; if (childStack.Count == 0) { childListStack.RemoveAt(childListStack.Count - 1); } else { rootNode = childStack[0]; childStack.RemoveAt(0); string indent = ""; for (int i = 0; i < childListStack.Count - 1; i++) { indent += (childListStack[i].Count > 0) ? "| " : " "; } Console.WriteLine(indent + "+- " + nodeLabel(rootNode)); var children = childernOf(rootNode); if (children.Count > 0) { childListStack.Add(new List<T>(children)); } } } } 的文档。

  

返回与特定资源ID关联的颜色。开始于   {@link android.os.Build.VERSION_CODES #M},返回的颜色将是   为指定的上下文主题设计样式。

     

@param id由aapt生成的所需资源标识符   工具。此整数对包,类型和资源条目进行编码。该   值0是无效的标识符。

     

@return单个颜色值,格式为0xAARRGGBB。

答案 1 :(得分:4)

你可以尝试一下:

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

因此,无需创建“颜色”对象,您可以传递colors.xml

中的值

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

答案 2 :(得分:2)

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

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

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

A = alpha 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上设置它:

view.setBackgroundResource(R.color.colorPrimary);