Не удается найти ColorStateList из идентификатора доступного ресурса только на Android Nougat

Я нашел эту ошибку в своем Crashlytics, и похоже, что она падает только для пользователей с предварительной версией Android Nougat.

Приложение вылетает при запуске (основное действие).

Трассировка стека

Fatal Exception: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.my.domain/com.my.domain.activities.MainActivity}: android.content.res.Resources$NotFoundException: Can't find ColorStateList from drawable resource ID #0x7f020057
   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646)
   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
   at android.app.ActivityThread.-wrap12(ActivityThread.java)
   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)
   at android.os.Handler.dispatchMessage(Handler.java:102)
   at android.os.Looper.loop(Looper.java:154)
   at android.app.ActivityThread.main(ActivityThread.java:6077)
   at java.lang.reflect.Method.invoke(Method.java)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
Caused by android.content.res.Resources$NotFoundException: Can't find ColorStateList from drawable resource ID #0x7f020057
   at android.content.res.ResourcesImpl.loadColorStateList(ResourcesImpl.java:840)
   at android.content.res.Resources.loadColorStateList(Resources.java:998)
   at android.content.res.TypedArray.getColor(TypedArray.java:447)
   at android.app.Activity.onApplyThemeResource(Activity.java:4039)
   at android.view.ContextThemeWrapper.initializeTheme(ContextThemeWrapper.java:198)
   at android.view.ContextThemeWrapper.setTheme(ContextThemeWrapper.java:140)
   at android.app.Activity.setTheme(Activity.java:4009)
   at android.support.v7.app.AppCompatActivity.setTheme(AppCompatActivity.java:90)
   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2592)
   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
   at android.app.ActivityThread.-wrap12(ActivityThread.java)
   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)
   at android.os.Handler.dispatchMessage(Handler.java:102)
   at android.os.Looper.loop(Looper.java:154)
   at android.app.ActivityThread.main(ActivityThread.java:6077)
   at java.lang.reflect.Method.invoke(Method.java)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

Похоже, Android Nougat больше не поддерживает некоторые системные цвета, которые я использую в своем приложении? Но я не знаю точно, как это исправить.

Изменить

Итак, я нашел ресурс с идентификатором 0x7f020057 в моем файле R, и вот он:

открытый статический окончательный int background_splash_gradient = 0x7f020057;

Я проверил, где я его использую, и вот он:

<style name="StartingWindowTheme" parent="AppTheme">
    <item name="android:windowBackground">@drawable/background_splash_gradient</item>
    <item name="android:colorBackground">@drawable/background_splash_gradient</item>
</style>

А это XML-файл background_splash_gradiend:

<shape xmlns:android="http://schemas.android.com/apk/res/android">

<gradient
    android:angle="135"
    android:endColor="#00d49e"
    android:startColor="#00bcd4"/>

</shape>

Я до сих пор не знаю, почему это вызывает проблемы с Nougat. Я попытался удалить стиль «StartingWindowTheme», и теперь приложение работает, оно больше не падает. Но мне нужно лучшее решение, чем это.

Изменить 2

Итак, я попытался удалить эту строку:

<item name="android:colorBackground">@drawable/background_splash_gradient</item>

И это работает. Похоже, проблема в android:colorBackground.

ВРЕМЕННОЕ ИСПРАВЛЕНИЕ

Так как проблема в указанной выше строчке, только на Nougat, я создал папку values-v24 и удалил строчку там. Приложение теперь работает на Nougat, но я был бы признателен за лучшее решение.


person Guy    schedule 01.08.2016    source источник
comment
вы используете что-нибудь из android.R.color?   -  person EpicPandaForce    schedule 01.08.2016
comment
Хм, на самом деле я не уверен, я только что сделал глобальный поиск android.R.color и ничего не нашел. Предполагая, что это проблема, какое будет решение?   -  person Guy    schedule 01.08.2016
comment
На самом деле, да, похоже, я использую его в xml. Я использую @android:цвет/прозрачность   -  person Guy    schedule 01.08.2016
comment
На самом деле, теперь, когда вы упомянули об этом, вы можете проверить свой файл R и увидеть имя переменной для 0x7f020057 (то есть 2130837591)   -  person EpicPandaForce    schedule 01.08.2016
comment
У меня были бы проблемы, если бы это действительно перестало работать, я много использовал android.R.color.white, android.R.color.transparent и android.R.color.black.   -  person EpicPandaForce    schedule 01.08.2016
comment
Итак, я искал ресурс 0x7f020057 в своем R-файле и обнаружил, где проблема, но я до сих пор не знаю, почему проблема. Пожалуйста, смотрите мой отредактированный вопрос.   -  person Guy    schedule 01.08.2016
comment
Что произойдет, если вы сохраните windowBackground, но удалите colorBackground?   -  person EpicPandaForce    schedule 01.08.2016
comment
Это работает, похоже, проблема в windowBackground.   -  person Guy    schedule 01.08.2016
comment
Итак, я предполагаю, что проблема была в colorBackground? Рад слышать, что вы нашли решение.   -  person EpicPandaForce    schedule 01.08.2016
comment
Судя по всему, это ошибка Android Nougat. Я открыл вопрос здесь: code.google.com /p/android/проблемы/   -  person Guy    schedule 01.08.2016


Ответы (2)


Я нашел, где была проблема и как ее исправить. Вот решение, я буду держать его простым.

Эта строка вызывала проблему:

<item name="android:colorBackground">@drawable/background_splash_gradient</item>

Оказывается, вы не можете установить drawable как colorBackground в XML, поэтому он работает после удаления этой строки.

Причина, по которой это зависало только на Nougat, заключается в том, что это было возможно в более ранних версиях.

person Guy    schedule 13.11.2016

Оказывается, согласно системе отслеживания ошибок Android, это работает по назначению.

android:colorBackground ожидает, что цвет не будет доступен для рисования.

person Filipe Bezerra de Sousa    schedule 23.08.2017