我正在使用
例如:
这个方法可行,但远非理想,我希望能够透明地使用
我已经尝试了
ContextCompat.getColor
获取颜色资源,并具有对已弃用方法的向后兼容性,例如Context
的getColor
。例如:
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.0
和28.0.0
版本的appcompat。有人遇到过这个问题吗?有更好的处理方式吗?
27.1.0
版本。 - marianosimone