可以用字符串获得颜色吗?
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)
在我的 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;
}
现在使用
获取资源 IDint 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)