【问题标题】:How to pass color resource as parameter (Android)如何将颜色资源作为参数传递(Android)
【发布时间】:2017-04-07 21:38:18
【问题描述】:

这可能是有史以来最简单的事情,但我这辈子还没有弄清楚。

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

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。我希望能够调用这个函数并获得背景颜色的变化。

【问题讨论】:

  • public void setColor(int color) { layout.setBackgroudColor(color); }
  • 感谢@Bhavnik,但这不起作用。我在问题中说过......
  • 您正在为 layout.setBackgroundColor 赋值,而不是直接设置颜色不起作用??
  • 你快到了。你不需要Color - 颜色实际上表示为int (注意getColor 返回一个int 而setBackgroundColor 接受一个int),但可能令人困惑的是getColor 如何也接受一个int 作为参数 - 它的期望 xml 中定义的颜色的资源 ID。所以你可以简单地传递resourceID并在其上使用getColor,或者,你可以传递颜色本身(作为一个int)并直接在其上使用setBackgroundColor
  • 那么我如何在函数@trooper 中传递它

标签: java android android-linearlayout background-color


【解决方案1】:

你可以试试这个:

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

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

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

<?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 颜色资源一起使用。

【讨论】:

  • 不起作用,需要颜色类型的资源。是的,我有 xml。这就是我要参考的内容
  • @MueyiwaMosesIkomi 您是否通过执行此 R.color.your_color_in_colors_xml 来引用?你能告诉我哪个是“布局”类吗?
  • @MueyiwaMosesIkomi 我已经用这个编辑了我的答案:另外,在您的情况下,您应该将方法 setColor(Color aColor) 修改为 setColor(int aColor) 以使其与 xml 颜色资源一起使用。
  • 我认为ContextCompat.getColor(colorId) 需要一个上下文,所以它可能是这样的ContextCompat.getColor(MainActivity.this, colorId)
【解决方案2】:

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

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

更新

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

setColor(颜色颜色)

。您需要将函数参数类型更新为int,就像我在上面的 sn-p 中所做的那样。

setColor(int颜色)

同样来自ContextCompat.getColor的文档。

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

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

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

【讨论】:

    【解决方案3】:

    首先,您似乎正在尝试设置 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);
    

    【讨论】:

    • 所以真的没有办法将 R.color.id 附加到 context.getResources().getColor(R.id.colorRes);
    • @MueyiwaMosesIkomi 不确定你的意思。 R.id 是资源 ID。除此之外没有任何意义。它仅用于链接到资源。还有,我搞砸了。它应该是R.color.,因为它是一种颜色资源。
    • @MueyiwaMosesIkomi:我已经编辑了很多答案。希望你能从中找到一些有用的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-02
    • 1970-01-01
    • 2011-07-25
    • 1970-01-01
    • 2013-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多