返回

如何从 getResources().getColor() 迁移到 ContextCompat.getColor()?

Android

从 getResources().getColor() 迁移:采用 ContextCompat.getColor()

问题:getResources().getColor() 已弃用

在 Android 6.0 Marshmallow 中,getResources().getColor() 已被标记为弃用。这意味着该方法不再被推荐使用,可能会在未来的 Android 版本中被删除。

解决方案:改用 ContextCompat.getColor()

为了解决此弃用问题,Android 开发人员建议改用 ContextCompat.getColor() 方法。ContextCompat 类提供对 Context 的各种实用方法的访问,包括 getColor() 方法。

使用方法

ContextCompat.getColor() 的用法与 getResources().getColor() 类似。只需将后者替换为前者即可。以下是如何使用 ContextCompat.getColor() 获取颜色的示例:

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

示例代码

下面的示例代码演示了如何在 Activity 中使用 ContextCompat.getColor()

import android.content.Context
import androidx.core.content.ContextCompat

class MyActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // 获取颜色的过时方法
        // val color = resources.getColor(R.color.color_name)

        // 获取颜色的推荐方法
        val color = ContextCompat.getColor(this, R.color.color_name)

        // 使用颜色...
    }
}

提示

  • ContextCompat.getColor() 仅适用于支持库版本 25.3.0 及更高版本。如果您使用的是较早版本的库,请使用 ResourcesCompat.getColor() 方法。
  • ContextCompat.getColor() 需要一个 Context 对象作为第一个参数。您可以通过以下方式获取 Context:
    • 在 Activity 中,使用 this 作为 Context。
    • 在 Fragment 中,使用 requireContext() 方法获取 Context。

常见问题解答

1. 为什么 getResources().getColor() 已弃用?

getResources().getColor() 已弃用,因为它不安全。它依赖于当前主题,这可能会导致意外行为,例如在不同主题中使用颜色不一致。

2. ContextCompat.getColor()getResources().getColor() 有什么区别?

ContextCompat.getColor()getResources().getColor() 的主要区别在于它不依赖于当前主题。它直接从资源文件中加载颜色,从而确保在不同主题中始终使用相同颜色。

3. 如何在较低版本的 Android 支持库中使用 ContextCompat.getColor()

如果您使用的是较低版本的 Android 支持库(低于 25.3.0),可以使用 ResourcesCompat.getColor() 方法。用法与 ContextCompat.getColor() 相同。

4. 我可以在哪里找到有关 ContextCompat.getColor() 的更多信息?

有关 ContextCompat.getColor() 的更多信息,请参阅 Android 开发人员文档:https://developer.android.com/reference/androidx/core/content/ContextCompat#getColor(Context,%20int)

5. 有没有其他替代 getResources().getColor() 的方法?

除了 ContextCompat.getColor() 之外,还有其他替代 getResources().getColor() 的方法,例如 Resources.getColor()Theme.obtainStyledAttributes().

结论

getResources().getColor() 迁移到 ContextCompat.getColor() 是一个重要的步骤,可以提高您的 Android 应用的安全性。使用 ContextCompat.getColor() 可以确保在不同主题中始终使用相同颜色,从而避免意外行为。