API 23中ContextCompat.getColor崩溃(未找到Context.getColor)

4
我正在使用ContextCompat.getColor获取颜色资源,并具有对已弃用方法的向后兼容性,例如ContextgetColor
例如: ContextCompat.getColor(context, R.color.black) 到目前为止,我在使用它的所有地方都很好,但是我在我的应用程序崩溃日志中看到了很多问题,如下所示:
Caused by java.lang.NoSuchMethodError: No virtual method getColor(I)I in class Landroid/content/Context; or its super classes (declaration of 'android.content.Context' appears in /system/framework/framework.jar)
   at android.support.v4.content.ContextCompat.getColor(ContextCompat.java:418)
   at com.myapp.MyView.method(MyView.kt:XXX)

看一下这些手机/Android版本,它们都属于棉花糖系列(6.0 - 6.1),我在API检测周围添加了一些日志记录,并确认它们处于API级别23。

就制造商而言,它们是小米、联想、中兴和OPPO。

我的解决方案是:

int color;
try {
    color = ContextCompat.getColor(context, colorRes);
} catch (NoSuchMethodError e) {
    if (Build.VERSION.SDK_INT != Build.VERSION_CODES.M) {
        // log for a while, to catch if any other versions/devices have issues
        Timber.e(
                e,
                "Couldn't use getColor in API level %s (%s)",
                Build.VERSION.SDK_INT,
                Build.VERSION.RELEASE
        );
    }
    color = context.getResources().getColor(colorRes);
}
// Now I know color has a value :D

这个方法可行,但远非理想,我希望能够透明地使用ContextCompat并忘记这件事。
我已经尝试了27.1.028.0.0版本的appcompat。有人遇到过这个问题吗?有更好的处理方式吗?

1
就我个人而言,我从未见过这种情况。这让我想知道是否有像Proguard这样的工具在剥离不应该剥离的ContextCompat方法。 - Ben P.
@BenP. 有趣的观点,感谢你提出来...我正在使用Proguard,但我怀疑它与此无关,因为这仅发生在特定的Android版本和某些制造商上。 - marianosimone
你的支持库版本是什么? - stallianz
@stallianz: 我正在使用 27.1.0 版本。 - marianosimone
我在各种设备上使用它,当然包括6.0-6.1版本,而且它运行良好。 - stallianz
显示剩余3条评论
1个回答

0

ContextCompat.getColor() 是 Support V4 库的一部分。

ContextCompat.getColor(YourActivity.this, R.color.my_color)

您需要在应用程序 build.gradle 中添加以下依赖项,以添加Support V4 库

compile 'com.android.support:support-v4:23.0.1'

希望这能对你有所帮助。

感谢您抽出时间。然而,正如我在问题中所说,这不是ContextCompat.getColor未被找到的问题,而是底层实现在某些特定情况下无法在Context对象中找到getColor的问题。 - marianosimone
你是在Fragment还是Activity类中编写这段代码? - Rahul Sharma
这是在一个自定义视图中,该视图位于一个 Activity 中。我根本没有使用 Fragment。 - marianosimone
我已经编辑了我的回答。请尝试将 context 替换为 YourActivity.this。你提到的错误与你正在传递的上下文对象有关。 - Rahul Sharma
你能解释一下为什么你认为是这种情况吗?同样的问题只会在Android M和某些供应商中出现... 在那些供应商的其他Android版本以及其他供应商的M版本中都可以正常工作。 - marianosimone

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