Сбой на 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

Определенно, ваша проблема - это библиотека каллиграфии, у меня та же проблема, и есть два способа ее решения:

  1. Вернитесь к целевой версии 28 и дождитесь возможного обновления Библиотека каллиграфии. 2
  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'