2016-11-23 53 views
2

这可能是有史以来最简单的事情,但对于我的生活,我还没有弄明白。如何通过颜色资源作为参数(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。我希望能够调用此函数并获取背景颜色变化。

+0

public void setColor(int color){ layout.setBackgroudColor(color); } – Bhavnik

+0

谢谢@Bhavnik,但这并不奏效。我说在这个问题... –

+0

你正在分配值layout.setBackgroundColor,而不是设置颜色直接不工作? – Bhavnik

回答

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

所以,没有必要创建一个“色”的对象,可以从颜色传递值。xml

另外,在你的情况下,你应该修改方法setColor(Color aColor)为setColor(int aColor)以使它可以使用xml颜色资源。

+0

不工作,期望颜色类型的资源。是的,我有xml。这就是我想要引用 –

+0

@MueyiwaMosesIkomi你通过做这个R.color.your_color_in_colors_xml引用? 你能告诉我哪一类是“布局”? – shollmann

+0

是的请@shollmann,我编辑了问题正文 –

3

您需要一个颜色资源ID。它开始于R.color这实际上是一个整数ID

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

UPDATE

虽然你使用它像setColor(R.color.colorAccent),但仍然您功能参数需要一个color例如

的setColor(颜色颜色)

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

的setColor(INT颜色)

ContextCompat.getColor的文档

同样。

返回与特定资源ID.Starting在 {@link android.os.Build.VERSION_CODES#m的}相关的颜色,返回的颜色将 风格为指定的上下文的主题。

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

@return形式为0xAARRGGBB的单一颜色值。

2

首先,它看起来像你试图设置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); 
+0

所以真的没有办法将R.color.id附加到context.getResources()。getColor(R.id.colorRes); –

+0

@MueyiwaMosesIkomi不知道你是什么意思。 'R.id'是一个资源ID。除此之外,这并不意味着什么。它只是意味着链接到资源。另外,我搞砸了。它应该是'R.color.',因为它是一种颜色资源。 – DeeV

+0

@MueyiwaMosesIkomi:我已经编辑了相当多的答案。希望你会在那里找到有帮助的东西。 – DeeV