69
votes

Crash sur Android 10 (InflateException dans layout / abc_screen_simple line # 17)

Mon application fonctionne bien d'Android 4.3 jusqu'à Android 9 Pie, mais mon application ne fonctionne pas sur Android 10 (Q API 29) et plante. Ceci est mon logcat - pourquoi cela se produit-il?

apply plugin: 'com.android.application'

android {
    compileSdkVersion 29
    defaultConfig {
        minSdkVersion 16
        targetSdkVersion 29
        multiDexEnabled true
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    } }

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.appcompat:appcompat:1.0.0'
    implementation 'com.google.android.material:material:1.0.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test:runner:1.2.0'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' }

et c'est mon 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">


</androidx.coordinatorlayout.widget.CoordinatorLayout>

mise à jour

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


7 commentaires

utilisez cette lib com.google.android.material: matériel: 1.0.0-rc01 insted de com.google.android.material: matériel: 1.0.0


@MilanPansuriya ne fonctionne pas


S'il vous plaît, partagez tout votre journal des erreurs ... Habituellement, la vraie raison de ces cas est mentionnée à la fin de la trace de crash


@ W0rmH0le j'ai trouvé un problème, il provenait de la bibliothèque de calligraphie donc je l'ai corrigé en le supprimant


@git, une autre façon plutôt que de supprimer la Calligraphy ? Je n'ai pas trouvé de solution au problème, mais je trouve cette bibliothèque pratique pour les polices, une idée?


Pour moi, cela se produit avec, plus ou moins, la même configuration gradle, mais je ne comprends pas pourquoi cela fonctionne sur les appareils avec Android P mais ne fonctionne pas sur les appareils avec Android Q ...


Mon projet n'utilise pas la calligraphie mais je suis toujours confronté à ce problème exact sur Android 10, quelqu'un est confronté au même problème avec moi? J'ai essayé d'ajouter calligraphy3: 3.1.1 et viewpump: 2.0.3 mais cela arrive toujours.


9 Réponses :


1
votes

Vous pouvez changer la version buildTools et la version SDK de 29 à 28

    targetSdk = 28
    compileSdk = 28
    buildTools = '28.0.3'


2 commentaires

C'est une solution de contournement, mais à un moment donné, vous voudrez mettre à jour targetSdk à 29 dans tous les cas, et vous devrez traiter correctement le problème.


Seul targetSdk doit être 28, compileSdk et buildTools peuvent être 29, mais c'est temporairement une solution



6
votes

Votre problème est définitivement la bibliothèque de calligraphie, j'ai le même problème et il y a 2 façons de le résoudre:

  1. Revenez à la version cible 28, et attendez une éventuelle mise à jour de la bibliothèque Calligraphy. 2
  2. Supprimer la bibliothèque

À propos de l'exception:

L'erreur d'exception dans Calligraphy provient de l'utilisation du reflet dans la bibliothèque. Voir la dernière ligne de cette exception:

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 dans votre documentation explique que certaines méthodes de réflexion (interfaces non SDK) sont limitées dans la plate-forme API 29.

Réflexion via Class.getDeclaredField () ou Class.getField () --------> NoSuchFieldException levée

Réflexion via Class.getDeclaredMethod (), Class.getMethod () ----> NoSuchMethodException levée.

Réflexion via Class.getDeclaredFields (), Class.getFields () --------> Les membres non-SDK ne sont pas dans les résultats.

Réflexion via Class.getDeclaredMethods (), Class.getMethods () -> Les membres non-SDK ne sont pas dans les résultats

Source: Restrictions sur les interfaces non SDK


1 commentaires

Selon toute vraisemblance, la dépendance de la calligraphie a été ajoutée dans un projet pour une raison. Pas besoin de l'enlever; la mise à jour vers Calligraphy 3 corrige également le problème d'InflateException: stackoverflow.com/a/57462616/56285



103
votes

Mettez à jour Calligraphy vers la dernière version pour résoudre ce problème: Lien: https://github.com/InflationX/Calligraphy/issues/35

Plus précisément, Calligraphy et ViewPump doivent être mis à jour:

implementation 'io.github.inflationx:calligraphy3:3.1.1'
implementation 'io.github.inflationx:viewpump:2.0.3'

La migration de Calligraphy 2 vers 3 nécessite quelques modifications de code; voir des exemples dans Calligraphy 3 README .


7 commentaires

C'est la bonne réponse. implémentation 'io.github.inflationx: calligraphy3: 3.1.1' implémentation 'io.github.inflationx: viewpump: 2.0.3'


@KonstantinKuznetsov a raison. Le problème dans notre cas: la bibliothèque Calligraphy a beaucoup changé entre la 2.2.0 et la 3.1.1, et il n'est pas trivial de mettre à jour le code de votre application. Par exemple, CalligraphyContextWrapper n'existe plus dans la version 3.1.1.


Mise à jour: en fait, il est assez simple de mettre à jour vers Calligraphy 3; les extraits de code dans le README le rendent simple. Mais le fait est que, au moins dans notre cas, la mise à jour de Calligraphy n'a pas aidé : obtenir toujours InflateException avec layout/abc_screen_simple après cela.


@Jonik hmm .. très étrange. Peut-être que certains modules autonomes de votre application ont encore d'anciennes dépendances avec Calligraphy? Avez-vous essayé de vérifier les dépendances transitives dans gradle, vous verrez peut-être quelque chose d'étrange?


@KonstantinKuznetsov: Merci beaucoup! J'ai vérifié :app:dependencies et j'ai vu que calligraphy3: 3.1.1 dépendait de viewpump: 1.0.0. En effet, dans nos fichiers de construction, nous n'avions qu'une dépendance explicite sur la calligraphie. L'ajout de viewpump: 2.0.3 corrige explicitement ce problème!


J'ai pris la liberté de modifier les informations manquantes dans la réponse.


Cela me sauve la vie.



1
votes

Lorsque vous êtes confronté à ce problème, mettez simplement à jour la calligraphie et le viewpump de votre application vers la dernière version. Actuellement, la version actuelle est: implementation 'io.github.inflationx: calligraphy3: 3.1.1' implementation 'io.github.inflationx: viewpump: 2.0.3'


0 commentaires

6
votes

si vous utilisez la calligraphie, vous devez donc migrer vers la calligraphie3: https://github.com/InflationX/Calligraphy

implementation 'io.github.inflationx:calligraphy3:3.1.1'
implementation 'io.github.inflationx:viewpump:2.0.3'


0 commentaires

4
votes

Migrez de chrisjenx / Calligraphy vers InflationX / Calligraphy et mettez à jour Calligraphy vers la dernière version


0 commentaires

16
votes
Please foloow this below steps.
1> First of all check build.gradle(:app) file
2> If you are using  this below library:
implementation 'uk.co.chrisjenx:calligraphy:2.3.0'
3> Update this " implementation 'uk.co.chrisjenx:calligraphy:2.3.0' " library with this below library.
implementation 'io.github.inflationx:viewpump:2.0.3'
implementation 'io.github.inflationx:calligraphy3:3.1.1'
4> In project where You use this below code :
@Override
    protected void attachBaseContext(Context newBase) {
        super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase));
    }

5> Update it with this below code:

   @Override
    protected void attachBaseContext(Context newBase) {
        super.attachBaseContext(ViewPumpContextWrapper.wrap(newBase));
    }

1 commentaires

Cette solution a été expliquée correctement et a résolu le problème



30
votes

Vous devez mettre à jour la version de la calligraphie et changer le code en fonction de la nouvelle version

Vous devez modifier le référentiel dans les dépendances de

super.attachBaseContext(ViewPumpContextWrapper.wrap(newBase));

à

ViewPump.init(ViewPump.builder()
            .addInterceptor(new CalligraphyInterceptor(
                    new CalligraphyConfig.Builder()
                            
            .setDefaultFontPath(getResources().getString(R.string.bariol))
                            .setFontAttrId(R.attr.fontPath)
                            .build()))
            .build());

Vous devez modifier l'utilisation de l'importation depuis

import uk.co.chrisjenx.calligraphy.CalligraphyConfig;

à

import io.github.inflationx.calligraphy3.CalligraphyConfig;

Configuration de la calligraphie de

CalligraphyConfig.initDefault(new CalligraphyConfig.Builder()
               .setDefaultFontPath(getResources().getString(R.string.bariol))
               .setFontAttrId(R.attr.fontPath)
                .build())) 
                .build());

à

implementation 'io.github.inflationx:calligraphy3:3.1.1'
implementation 'io.github.inflationx:viewpump:2.0.3'

J'ai utilisé le bariol de police, vous pouvez le changer pour le vôtre.

& newbase vers

implementation "uk.co.chrisjenx:calligraphy:$caligraphyVersion"


4 commentaires

Merci beaucoup


Merci beaucoup. C'est complet et bien expliqué!


les réponses ne sont pas vraiment meilleures que cela, merci !!


vous sauvez la vie .Merci



0
votes

Mettez à jour votre importation de calligraphie dans votre fichier build.gradle (: app) avec ceci ci - dessous

implémentation 'io.github.inflationx: viewpump: 2.0.3'

implémentation 'io.github.inflationx: calligraphy3: 3.1.1'

et utilisez ViewPumpContextWrapper au lieu de CalligraphyContextWrapper


0 commentaires