可以用字符串获得颜色吗?

Possible to get color with string?

在我的 values 文件夹中我有 my_colors.xml:

<resources>
    <!-- Orange -->
    <color name="orangePrimary">#f6a02d</color>
    <color name="orange1">#e3952a</color>
    <color name="orange2">#da8f28</color>
    <color name="orange3">#d08926</color>
</resources>

有没有办法只用名称的字符串来获取这些颜色? 类似于 view.setBackgroundColor.getColor("orange1");

对于图像你有这个getResources().getIdentifier("my_image", "drawable", getPackageName());

希望你们明白我的意思。 你好。

从 Android 支持库 23 开始,新的 getColor() 方法已添加到 ContextCompat.

所以,只需调用:

ContextCompat.getColor(context, R.color.your_color);

另一个已被弃用getResources.getColor()所以你需要实现上面的。没有任何方法可以仅通过颜色名称来访问它。您必须提供颜色文件中的颜色 ID。

好的,我现在使用反射按名称获得了颜色,并在我这边工作。

你需要写一个这样的函数。

public int getColorByName(String name) {
    int colorId = 0;

    try {
        Class res = R.color.class;
        Field field = res.getField(name);
        colorId = field.getInt(null);
    } catch (Exception e) {
        e.printStackTrace();
    }

    return colorId;
}

现在使用

获取资源 ID
int resourceId = getColorByName("orange1");

并且 像这样在您的 ImageView 中将可绘制对象设置为资源

imageView.setBackgroundResource(resourceId);

我试过设置 img.setBackgroundColor(resourceId) 却设置了错误的颜色。

在你的情况下,我想建议将颜色保存在你的 res/values/arrays.xml 中的类型化数组中,就像这样

<array name="colors">
    <item>#FFFF0000</item>
    <item>#FF00FF00</item>
    <item>#FF0000FF</item>
</array>

请参阅 Typed Array 开发人员文档了解如何使用它。

您是否尝试过以下方法:

// java
Resources res = context.getResources();
String packageName = context.getPackageName();

int colorId = res.getIdentifier("my_color", "color", packageName);
int desiredColor = res.getColor(colorId);
// kotlin
val res: Resources = context.getResources()
val packageName: String = context.getPackageName()

val colorId: Int = res.getIdentifier("my_color", "color", packageName)
val desiredColor: Int = res.getColor(colorId)

希望对您有所帮助!


注意: 这已被弃用,您可以执行以下操作,它处理 pre 和 post Marshmallow (API 23):

// java
Resources res = context.getResources();
String packageName = context.getPackageName();

int colorId = res.getIdentifier("my_color", "color", packageName);
int desiredColor = ContextCompat.getColor(context, colorId);
// kotlin
val res: Resources = context.getResources()
val packageName: String = context.getPackageName()

val colorId: Int = res.getIdentifier("my_color", "color", packageName)
val desiredColor: Int = ContextCompat.getColor(context, colorId)