Сбой ContextCompat.getColor в API 23 (Context.getColor не найден) - PullRequest
0 голосов
/ 26 октября 2018

Я использую 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. Кто-нибудь сталкивался с этой проблемой? Есть ли лучший способ справиться с этим?

1 Ответ

0 голосов
/ 06 ноября 2018

ContextCompat.getColor() является частью библиотеки Support V4.

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

Вам необходимо добавить библиотеку Support V4 , добавив следующие зависимости в ваше приложение build.gradle:

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

Надеюсь, это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...