该Resources.getColor(int id)
方法已被弃用。
@ColorInt
@Deprecated
public int getColor(@ColorRes int id) throws NotFoundException {
return getColor(id, null);
}
我该怎么办?
该Resources.getColor(int id)
方法已被弃用。
@ColorInt
@Deprecated
public int getColor(@ColorRes int id) throws NotFoundException {
return getColor(id, null);
}
我该怎么办?
Answers:
从Android支持库23开始,
已将
新的getColor()方法添加到ContextCompat
。
其来自官方JavaDoc的描述:
返回与特定资源ID关联的颜色
从M开始,将为指定的Context主题设置返回的颜色样式。
因此,只需致电:
ContextCompat.getColor(context, R.color.your_color);
tl; dr:
ContextCompat.getColor(context, R.color.my_color)
说明:
您将需要使用ContextCompat.getColor(),它是Support V4库的一部分(它将适用于所有以前的API)。
ContextCompat.getColor(context, R.color.my_color)
如果尚未使用支持库,则需要将以下行添加到dependencies
应用程序内部的数组中build.gradle
(注意:如果您已经使用了appcompat(V7)库,则这是可选的):
compile 'com.android.support:support-v4:23.0.0' # or any version above
如果您关心主题,则文档中指定:
从M开始,将为指定的Context主题设置返回的颜色样式
M
,返回的颜色将为指定的Context主题设置样式。 ”
我不想只为getColor包括支持库,所以我正在使用类似
public static int getColorWrapper(Context context, int id) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
return context.getColor(id);
} else {
//noinspection deprecation
return context.getResources().getColor(id);
}
}
我猜代码应该可以正常工作,并且弃用的getColor
API不能从<23消失。
这就是我在Kotlin中使用的:
/**
* Returns a color associated with a particular resource ID.
*
* Wrapper around the deprecated [Resources.getColor][android.content.res.Resources.getColor].
*/
@Suppress("DEPRECATION")
@ColorInt
fun getColorHelper(context: Context, @ColorRes id: Int) =
if (Build.VERSION.SDK_INT >= 23) context.getColor(id) else context.resources.getColor(id);
在Android Marshmallow中,不赞成使用许多方法。
例如,获取颜色
ContextCompat.getColor(context, R.color.color_name);
也可用于绘画
ContextCompat.getDrawable(context, R.drawable.drawble_name);
对于所有Kotlin用户:
context?.let {
val color = ContextCompat.getColor(it, R.color.colorPrimary)
// ...
}
val color = ContextCompat.getColor(context, R.color.colorPrimary)
。变量“ it”可以是任何东西,但必须是Context。
it
在这种情况下是context
,因为我context?.let {
用来检查的值context
是否不为null。该函数getColor()
仅接受非空上下文。在这里阅读更多有关let
如何使用它的信息:kotlinlang.org/docs/reference/scope-functions.html#let
在Kotlin的RecyclerView中
inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
fun bind(t: YourObject, listener: OnItemClickListener.YourObjectListener) = with(itemView) {
textViewcolor.setTextColor(ContextCompat.getColor(itemView.context, R.color.colorPrimary))
textViewcolor.text = t.name
}
}
使用getColor(Resources, int, Theme)
的方法ResourcesCompat
从Android支持库。
int white = new ResourcesCompat().getColor(getResources(), R.color.white, null);
我觉得它更好地反映比你的问题getColor(Context, int)
的ContextCompat
,因为你问Resources
。在API级别23之前,将不会应用主题,并且该方法将调用到,getColor(int)
但您不会收到不建议使用的警告。主题也可能是null
。
如果您不一定需要资源,请使用parseColor(String)
:
Color.parseColor("#cc0066")
如果您当前的分钟。API级别为23,您可以getColor()
像通过以下方式简单地使用来获取字符串资源getString()
:
//example
textView.setTextColor(getColor(R.color.green));
// if `Context` is not available, use with context.getColor()
您可以限制API级别低于23:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
textView.setTextColor(getColor(R.color.green));
} else {
textView.setTextColor(getResources().getColor(R.color.green));
}
但为简单起见,您可以像下面这样作为接受的答案:
textView.setTextColor(ContextCompat.getColor(context, R.color.green))
来自资源。
我也感到沮丧。我的需求非常简单。我只想要资源中的ARGB颜色,所以我写了一个简单的静态方法。
protected static int getARGBColor(Context c, int resId)
throws Resources.NotFoundException {
TypedValue color = new TypedValue();
try {
c.getResources().getValue(resId, color, true);
}
catch (Resources.NotFoundException e) {
throw(new Resources.NotFoundException(
String.format("Failed to find color for resourse id 0x%08x",
resId)));
}
if (color.type != TYPE_INT_COLOR_ARGB8) {
throw(new Resources.NotFoundException(
String.format(
"Resourse id 0x%08x is of type 0x%02d. Expected TYPE_INT_COLOR_ARGB8",
resId, color.type))
);
}
return color.data;
}