getResources().getColor()已经被弃用。

563

使用:buildToolsVersion "22.0.1"targetSdkVersion 22在我的gradle文件中。

我发现有用的getResources().getColor(R.color.color_name)已经被弃用。

那我应该使用什么代替呢?


你在哪里看到的?http://developer.android.com/reference/android/content/res/Resources.html#getColor(int) - Jared Burrows
4
这个问题已经在这里讨论过了:https://dev59.com/HlwZ5IYBdhLWcg3wVO9U。 - BrentM
8
使用ContextCompat.getColor(context, R.color.color_name)来获取颜色值。 - Ashokchakravarthi Nagarajan
在适配器上下文中,context.getResources()。 - younes
1
ContextCompat.getColor(context, R.color.colorname)对于Fragment,它将是“activity as Context”,而对于Activity,它将是“this”。 - Adam Noor
4个回答

1254

看起来最好的做法是使用:

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

例如:

yourView.setBackgroundColor(ContextCompat.getColor(applicationContext,
                            R.color.colorAccent))

这将适当选择使用Marshmallow的两个参数方法或先前的方法。


1
Kotlin: 用'this'替换'applicationContext' - Ben
使用 Kotlin 时,可以使用以下代码:ContextCompat.getColor(this, R.color.color_name)。 - Rehan Khan
如果您有一个“Resources”的实例而不是“Context”怎么办? - android developer

74

在Android M中,它已经被弃用了,因此您必须为Android M及更低版本做出特殊处理。只需在getColor函数上添加当前主题即可。您可以使用getTheme()获取当前主题。

这将在片段中起作用,您可以将getActivity()替换为getBaseContext()yourContext等,这些都保存了您当前的上下文。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    yourTitle.setTextColor(getActivity().getResources().getColor(android.R.color.white, getActivity().getTheme()));
}else {
    yourTitle.setTextColor(getActivity().getResources().getColor(android.R.color.white));
}

*p.s:在M版本中颜色已经被弃用,但在L版本中图形已经被弃用

*p.s:color 在 M 版本中已经被废弃,但 drawable 在 L 版本中也已经被废弃。


2
我会使用getContext().getTheme()代替getActivity().getTheme() - Vinayak Garg
非常有用。对我很有效。 - SIVAKUMAR.J

49

你需要使用ContextCompat.getColor(),它是Support V4库的一部分(因此将适用于所有以前的API)。

ContextCompat.getColor(context, R.color.my_color)
按照文档说明,“从 M 开始,返回的颜色将为指定上下文的主题进行样式设置”。所以不用担心它。
您可以通过在应用程序 build.gradle 文件中的依赖项数组中添加以下内容来添加 Support V4 库:
compile 'com.android.support:support-v4:23.0.1'

1
如果您有一个“Resources”的实例而不是“Context”怎么办? - android developer

26

我发现有用的getResources().getColor(R.color.color_name)已经被弃用。

根据文档,它在API Level 21中没有被弃用。

但是,在M开发者预览版中,它被弃用了。然而,替换方法(一个两个参数的getColor()方法,它需要颜色资源ID和一个Resources.Theme对象)仅适用于M开发者预览版。

因此,现在,请继续使用单参数的getColor()方法。今年晚些时候,考虑在Android M设备上使用两个参数的getColor()方法,并在旧设备上退回到弃用的单参数getColor()方法。


1
为什么Android的开发者不直接保留那个可以内部选择默认选项的方法,并为那些需要的人提供第二个重载方法呢?谷歌需要停止将他们自己的开发者问题强加给大众。这是不必要的改变和过度复杂化。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接