getColor(int id)在Android 6.0棉花糖(API 23)上已弃用

Resources.getColor(int id)方法已被弃用。

@ColorInt@Deprecatedpublic int getColor(@ColorRes int id) throws NotFoundException {return getColor(id, null);}

我该怎么办?

318415 次浏览

从Android支持库23开始,
ContextCompat中添加了一个新的获取颜色方法。

它来自官方JavaDoc的描述:

返回与特定资源ID关联的颜色

从M开始,返回的颜色将为指定的Context主题设置样式。


所以,打电话

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

您可以查看ContextCompat.getColor()GitHub上的源代码

tl; dr:

ContextCompat.getColor(context, R.color.my_color)

说明:

您需要使用ContextCompat.get颜色(),它是Support V4库的一部分(它适用于所有以前的API)。

ContextCompat.getColor(context, R.color.my_color)

如果您尚未使用支持库,则需要将以下行添加到应用程序build.gradle中的dependencies数组中(注意:如果您已经使用appcompat(V7)库,则它是可选的):

compile 'com.android.support:support-v4:23.0.0' # or any version above

如果您关心主题,则留档指定:

从M开始,返回的颜色将为指定的颜色设置样式背景主题

在Android棉花糖中,许多方法被弃用。

例如,要使用颜色

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

也可以用来画画

ContextCompat.getDrawable(context, R.drawable.drawble_name);

我不想仅为获取颜色包含支持库,所以我使用了类似的东西

public static int getColorWrapper(Context context, int id) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {return context.getColor(id);} else {//noinspection deprecationreturn context.getResources().getColor(id);}}

我想代码应该可以正常工作,不建议使用的getColor不能从API<23中消失。

这是我在静态编程语言中使用的:

/*** Returns a color associated with a particular resource ID.** Wrapper around the deprecated [Resources.getColor][android.content.res.Resources.getColor].*/@Suppress("DEPRECATION")@ColorIntfun getColorHelper(context: Context, @ColorRes id: Int) =if (Build.VERSION.SDK_INT >= 23) context.getColor(id) else context.resources.getColor(id);

使用Android支持库中ResourcesCompatgetColor(Resources, int, Theme)方法。

int white = ResourcesCompat.getColor(getResources(), R.color.white, null);

我认为它比ContextCompatgetColor(Context, int)更好地反映了你的问题,因为你问了Resources。在API级别23之前,主题将不被应用,方法调用到getColor(int),但你不会有弃用警告。主题也可能是null

我也很沮丧。我的需求非常简单。我只想要资源中的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;}

如果您不一定需要资源,请使用parseColor(String)
Color.parseColor("#cc0066")

对于所有静态编程语言用户:

context?.let {val color = ContextCompat.getColor(it, R.color.colorPrimary)// ...}

静态编程语言中的回收器视图

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}}

如果您的当前最小值。API级别为23,您可以简单地使用#0像我们使用getString()获取字符串资源:

//exampletextView.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))

资源

ContextCompatAndroidX目录

ContextCompat支持

在静态编程语言中,您可以:

ContextCompat.getColor(requireContext(), R.color.stage_hls_fallback_snackbar)

如果可以从调用函数的位置访问请求上下文()。我在尝试时遇到错误

ContextCompat.getColor(context, R.color.stage_hls_fallback_snackbar)

最好的等效方法是使用ContextCompat.getColorResourcesCompat.getColor。我做了一些扩展函数来快速迁移:

@ColorIntfun Context.getColorCompat(@ColorRes colorRes: Int) = ContextCompat.getColor(this, colorRes)
@ColorIntfun Fragment.getColorCompat(@ColorRes colorRes: Int) = activity!!.getColorCompat(colorRes)
@ColorIntfun Resources.getColorCompat(@ColorRes colorRes: Int) = ResourcesCompat.getColor(this, colorRes, null)

在活动中使用ContextCompat

ContextCompat.getColor(context, R.color.color_name)

在adpper

private Context context;

context.getResources().getColor()