Android 解释使用ContextCompat类中的getColor()方法的主要原因?

Android 解释使用ContextCompat类中的getColor()方法的主要原因?,android,converter,getcolor,Android,Converter,Getcolor,我有以下代码行: mColorResourceIdR.color.category\u编号保持mColorResourceId=R.color.category\u编号 当我将mColorResourceId直接传递到setBackgroundColor(mColorResourceId)时它不会改变颜色,尽管方法接受intvalue 我的问题是为什么我需要这个额外的步骤int color=ContextCompat.getColor(getContext(),mColorResourceId)

我有以下代码行:
mColorResourceId
R.color.category\u编号保持
mColorResourceId=R.color.category\u编号

当我将
mColorResourceId
直接传递到
setBackgroundColor(mColorResourceId)时它不会改变颜色,尽管方法接受
int
value


我的问题是为什么我需要这个额外的步骤
int color=ContextCompat.getColor(getContext(),mColorResourceId)
更改颜色???

方法接受一个
int
,该int应该是
aarggbb
格式的颜色值。资源ID
R.color.category\u number
也是一个
int
,但它不是一个颜色值;相反,它是
颜色
资源的标识符。调用
ContextCompat.getColor(getContext(),mColorResourceId)
检索与
mColorResourceId
对应的实际颜色值


Android进行这种间接寻址的部分原因是为了提供灵活性。返回的实际颜色可能取决于当前主题或设备配置,并可能在运行时实际更改(取决于您如何声明颜色资源)。

方法接受
setBackgroundColor()
int
应该是
aarggbb
格式的颜色值。资源ID
R.color.category\u number
也是一个
int
,但它不是一个颜色值;相反,它是
颜色
资源的标识符。调用
ContextCompat.getColor(getContext(),mColorResourceId)
检索与
mColorResourceId
对应的实际颜色值


Android进行这种间接寻址的部分原因是为了提供灵活性。返回的实际颜色可能取决于当前主题或设备配置,并可能在运行时实际发生变化(取决于您如何声明颜色资源)。

当您碰巧想从资源中设置颜色时,其他开发人员可能想用Java硬编码颜色,或从文件/数据库加载颜色,或者获取颜色作为Web服务响应的一部分,或者随机选择颜色。因此,
setBackgroundColor()
接受颜色,而不仅仅是颜色的资源ID。当您碰巧想从资源中设置颜色时,其他开发人员可能想用Java硬编码颜色,或者从文件/数据库加载颜色,或者将颜色作为Web服务响应的一部分,或者随机选择颜色。因此,
setBackgroundColor()
接受颜色,而不仅仅是颜色的资源ID。为什么我要用mColorResourceId传递getContext()??为什么我需要?@Android Khatib-这是为了让检索到的颜色对当前主题敏感。例如,假设您将颜色资源定义为
?attr/some\u theme\u color\u name
,其中您定义了自己的主题属性
some\u theme\u color\u name
。然后,对于Android Marshmallow和更高版本,
ContextCompat.getColor()
将使用传递的上下文的主题集来查找颜色。为什么我传递带有mColorResourceId的getContext()??为什么我需要?@Android Khatib-这是为了让检索到的颜色对当前主题敏感。例如,假设您将颜色资源定义为
?attr/some\u theme\u color\u name
,其中您定义了自己的主题属性
some\u theme\u color\u name
。然后,对于Android Marshmallow和更高版本,
ContextCompat.getColor()
将使用传递的上下文的主题集来查找颜色。
LinearLayout linearLayout = (LinearLayout) findViewById(R.id.linear);
int color = ContextCompat.getColor(getContext(), mColorResourceId);
linearLayout.setBackgroundColor(color);