Я использую 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, все они принадлежат к семейству Marshmallow (6.0–6.1), и я добавил некоторые записи об обнаружении API и могу подтвердить, что они на уровне API 23.
С точки зрения производителей это Xiaomi, Lenovo, ZTE и 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
и забыть об этом.
Я пробовал appcompat версий 27.1.0
и 28.0.0
. Кто-нибудь сталкивался с этой проблемой? Есть ли лучший способ справиться с этим?