Сбой на Android 10 (исключение InflateException в строке layout/abc_screen_simple # 17)
Мое приложение работает нормально с Android 4.3 до Android 9 Pie, но мое приложение не работает на Android 10 (Q API 29) и вылетает. Это мой logcat - почему это происходит?
java.lang.RuntimeException: Unable to start activity
ComponentInfo{ir.mahdi.circulars/ir.mahdi.circulars.MainActivity}:
android.view.InflateException: Binary XML file line #17
in ir.mahdi.circulars:layout/abc_screen_simple: Binary XML file line #17
in ir.mahdi.circulars:layout/abc_screen_simple:
Error inflating class androidx.appcompat.widget.FitWindowsLinearLayout
и это мой mainActivity.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
android:layoutDirection="ltr"
tools:context=".MainActivity">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingRight="16dp"
android:paddingTop="12dp"
android:paddingBottom="12dp"
android:background="@color/colorPrimaryLight">
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorPrimaryLight">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
android:layout_width="match_parent"
android:background="@color/colorPrimaryLight"
android:layout_height="40dp">
</androidx.appcompat.widget.Toolbar>
</com.google.android.material.appbar.AppBarLayout>
</RelativeLayout>
<androidx.viewpager.widget.ViewPager
android:id="@+id/viewpager"
android:layout_marginTop="@dimen/spacing_xxlarge"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
Ответы
Ответ 1
Обновите Calligraphy
до последней версии, чтобы решить эту проблему:
Ссылка: https://github.com/InflationX/Calligraphy/issues/35
В частности, каллиграфия и ViewPump должны быть обновлены:
implementation 'io.github.inflationx:calligraphy3:3.1.1'
implementation 'io.github.inflationx:viewpump:2.0.3'
Переход с каллиграфии 2 на 3 требует некоторых изменений кода; см. примеры в Каллиграфии 3 README.
Ответ 2
Согласно этому ответу, вы не должны использовать это. Этот виджет, имеющий аннотацию @hide, означает, что он доступен для публичного использования до сих пор. Поэтому вместо того, чтобы использовать этот FitWindowsLinearLayout, вы должны будете использовать LinearLayout и присвоить ему нужные атрибуты.
Ответ 3
Вы можете изменить версию buildTools и версию sdk с 29 на 28
targetSdk = 28
compileSdk = 28
buildTools = '28.0.3'
Ответ 4
Определенно, ваша проблема - это библиотека каллиграфии, у меня та же проблема, и есть два способа ее решения:
- Вернитесь к целевой версии 28 и дождитесь возможного обновления
Библиотека каллиграфии. 2
- Удалить библиотеку
Об исключении:
Ошибка исключения в каллиграфии происходит из-за использования отражения в библиотеке. Смотрите последнюю строку этого исключения:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example, PID: 8220
android.view.InflateException: Binary XML file line #17 in com.example:layout/abc_screen_simple: Binary XML file line #17 in com.example/abc_screen_simple: Error inflating class androidx.appcompat.widget.FitWindowsLinearLayout
Caused by: android.view.InflateException: Binary XML file line #17 in com.example/abc_screen_simple: Error inflating class androidx.appcompat.widget.FitWindowsLinearLayout
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object java.lang.reflect.Field.get(java.lang.Object)' on a null object reference
Android в вашей документации объясняет, что некоторые методы отражения (не SDK-интерфейсы) ограничены в платформе API 29.
Отражение с помощью Class.getDeclaredField() или Class.getField() ----→ NoSuchFieldException сгенерировано
Reflection via Class.getDeclaredMethod(), Class.getMethod() → NoSuchMethodException thrown.
Reflection via Class.getDeclaredFields(), Class.getFields() ----→ Non-SDK members not in results.
Reflection via Class.getDeclaredMethods(), Class.getMethods() → Non-SDK members not in results
Источник: ограничения на интерфейсы не SDK
Ответ 5
Столкнувшись с этой проблемой, просто обновите каллиграфию и помпу в приложении до последней версии. В настоящее время текущая версия: реализация 'io.github.inflationx: calligraphy3: 3.1.1' реализация 'io.github.inflationx: viewpump: 2.0.3'