【问题标题】:explain the main reason to use getColor() method from ContextCompat class?解释使用 ContextCompat 类中的 getColor() 方法的主要原因?
【发布时间】:2017-03-23 19:38:15
【问题描述】:
LinearLayout linearLayout = (LinearLayout) findViewById(R.id.linear);
int color = ContextCompat.getColor(getContext(), mColorResourceId);
linearLayout.setBackgroundColor(color);

我有这行代码: mColorResourceId 等待 R.color.category_numbers -> mColorResourceId = R.color.category_numbers

当我将mColorResourceId 直接传递给setBackgroundColor(mColorResourceId); 时,尽管接受int 值的方法不会改变颜色。

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

【问题讨论】:

  • 当您碰巧想要从资源中设置颜色时,其他开发人员可能想要在 Java 中硬编码颜色,或者从文件/数据库中加载颜色,或者获取颜色作为一部分Web 服务响应,或随机选择一种颜色。因此,setBackgroundColor() 采用 color,而不仅仅是颜色的资源 ID。

标签: android converter getcolor


【解决方案1】:

setBackgroundColor() 方法接受一个int,它应该是aarrggbb 格式的颜色值。资源IDR.color.category_numbers也是int,但不是颜色值;相反,它是color 资源的标识符。调用ContextCompat.getColor(getContext(), mColorResourceId)获取mColorResourceId对应的实际颜色值。

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

【讨论】:

  • 为什么我将 getContext() 与 mColorResourceId 一起传递?为什么我需要?
  • @AndroidAL-Khatib - 这是为了让检索到的颜色对当前主题敏感。例如,假设您将颜色资源定义为<color name="category_numbers">?attr/some_theme_color_name</color>,并在其中定义了自己的主题属性some_theme_color_name。然后,对于 Android Marshmallow 及更高版本,ContextCompat.getColor() 将使用传递的上下文的主题集来查找颜色。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-17
  • 2014-11-26
  • 1970-01-01
相关资源
最近更新 更多