AndroidX: Appcompat I: erreur d'art android.view.View $ OnUnhandledKeyEventListener

106

Dans un projet nouvellement créé avec Androidx: appcompat: appcompat: 1.0.0-rc01, j'obtiens le

java.lang.ClassNotFoundException: Didn't find class 
"android.view.View$OnUnhandledKeyEventListener" on path: DexPathList

J'avais également ajouté la configuration.

configurations.all {
    resolutionStrategy.eachDependency { DependencyResolveDetails details ->
        def requested = details.requested
        if (requested.group == "androidx.appcompat") {
            if (!requested.name.startsWith("multidex")) {
                details.useVersion "1.+"
            }
        }
    }
}

Celui-ci n'affecte pas la fonctionnalité de l'application ou se bloque. Mais il y a toujours cette erreur lorsque l'application est en cours d'exécution. Veuillez m'aider à résoudre l'erreur. La trace de pile entière est la suivante.

I/art: Rejecting re-init on previously-failed class java.lang.Class<androidx.core.view.ViewCompat$OnUnhandledKeyEventListenerWrapper>: java.lang.NoClassDefFoundError: Failed resolution of: Landroid/view/View$OnUnhandledKeyEventListener;
I/art:     at void androidx.core.view.ViewCompat.setBackground(android.view.View, android.graphics.drawable.Drawable) (ViewCompat.java:2341)
        at void androidx.appcompat.widget.ActionBarContainer.<init>(android.content.Context, android.util.AttributeSet) (ActionBarContainer.java:62)
        at java.lang.Object java.lang.reflect.Constructor.newInstance0!(java.lang.Object[]) (Constructor.java:-2)
        at java.lang.Object java.lang.reflect.Constructor.newInstance(java.lang.Object[]) (Constructor.java:430)
        at android.view.View android.view.LayoutInflater.createView(java.lang.String, java.lang.String, android.util.AttributeSet) (LayoutInflater.java:645)
        at android.view.View android.view.LayoutInflater.createViewFromTag(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet, boolean) (LayoutInflater.java:787)
        at android.view.View android.view.LayoutInflater.createViewFromTag(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet) (LayoutInflater.java:727)
        at void android.view.LayoutInflater.rInflate(org.xmlpull.v1.XmlPullParser, android.view.View, android.content.Context, android.util.AttributeSet, boolean) (LayoutInflater.java:858)
        at void android.view.LayoutInflater.rInflateChildren(org.xmlpull.v1.XmlPullParser, android.view.View, android.util.AttributeSet, boolean) (LayoutInflater.java:821)
        at android.view.View android.view.LayoutInflater.inflate(org.xmlpull.v1.XmlPullParser, android.view.ViewGroup, boolean) (LayoutInflater.java:518)
        at android.view.View android.view.LayoutInflater.inflate(int, android.view.ViewGroup, boolean) (LayoutInflater.java:426)
        at android.view.View android.view.LayoutInflater.inflate(int, android.view.ViewGroup) (LayoutInflater.java:377)
        at android.view.ViewGroup androidx.appcompat.app.AppCompatDelegateImpl.createSubDecor() (AppCompatDelegateImpl.java:607)
        at void androidx.appcompat.app.AppCompatDelegateImpl.ensureSubDecor() (AppCompatDelegateImpl.java:518)
        at void androidx.appcompat.app.AppCompatDelegateImpl.setContentView(int) (AppCompatDelegateImpl.java:466)
        at void androidx.appcompat.app.AppCompatActivity.setContentView(int) (AppCompatActivity.java:140)
        at void com.connectdb.truckish.common.base.BaseActivity.onCreate(android.os.Bundle) (BaseActivity.java:44)
        at void com.connectdb.truckish.MainActivity.onCreate(android.os.Bundle) (MainActivity.java:14)
        at void android.app.Activity.performCreate(android.os.Bundle) (Activity.java:6672)
        at void android.app.Instrumentation.callActivityOnCreate(android.app.Activity, android.os.Bundle) (Instrumentation.java:1140)
        at android.app.Activity android.app.ActivityThread.performLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.content.Intent) (ActivityThread.java:2612)
        at void android.app.ActivityThread.handleLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.content.Intent, java.lang.String) (ActivityThread.java:2724)
        at void android.app.ActivityThread.-wrap12(android.app.ActivityThread, android.app.ActivityThread$ActivityClientRecord, android.content.Intent, java.lang.String) (ActivityThread.java:-1)
        at void android.app.ActivityThread$H.handleMessage(android.os.Message) (ActivityThread.java:1473)
        at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:102)
        at void android.os.Looper.loop() (Looper.java:154)
        at void android.app.ActivityThread.main(java.lang.String[]) (ActivityThread.java:6123)
        at java.lang.Object java.lang.reflect.Method.invoke!(java.lang.Object, java.lang.Object[]) (Method.java:-2)
        at void com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run() (ZygoteInit.java:867)
        at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:757)
    Caused by: java.lang.ClassNotFoundException: Didn't find class "android.view.View$OnUnhandledKeyEventListener" on path: DexPathList[[zip file "/data/app/com.connectdb.truckish-2/base.apk", zip file "/data/app/com.connectdb.truckish-2/split_lib_dependencies_apk.apk", zip file "/data/app/com.connectdb.truckish-2/split_lib_slice_0_apk.apk", zip file "/data/app/com.connectdb.truckish-2/split_lib_slice_1_apk.apk", zip file "/data/app/com.connectdb.truckish-2/split_lib_slice_2_apk.apk", zip file "/data/app/com.connectdb.truckish-2/split_lib_slice_3_apk.apk", zip file "/data/app/com.connectdb.truckish-2/split_lib_slice_4_apk.apk", zip file "/data/app/com.connectdb.truckish-2/split_lib_slice_5_apk.apk", zip file "/data/app/com.connectdb.truckish-2/split_lib_slice_6_apk.apk", zip file "/data/app/com.connectdb.truckish-2/split_lib_slice_7_apk.apk", zip file "/data/app/com.connectdb.truckish-2/split_lib_slice_8_apk.apk", zip file "/data/app/com.connectdb.truckish-2/split_lib_slice_9_apk.apk"],nativeLibraryDirectories=[
        at java.lang.Class dalvik.system.BaseDexClassLoader.findClass(java.lang.String) (BaseDexClassLoader.java:56)
        at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String, boolean) (ClassLoader.java:380)
        at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String) (ClassLoader.java:312)
        at void androidx.core.view.ViewCompat.setBackground(android.view.View, android.graphics.drawable.Drawable) (ViewCompat.java:2341)
        at void androidx.appcompat.widget.ActionBarContainer.<init>(android.content.Context, android.util.AttributeSet) (ActionBarContainer.java:62)
        at java.lang.Object java.lang.reflect.Constructor.newInstance0!(java.lang.Object[]) (Constructor.java:-2)
        at java.lang.Object java.lang.reflect.Constructor.newInstance(java.lang.Object[]) (Constructor.java:430)
        at android.view.View android.view.LayoutInflater.createView(java.lang.String, java.lang.String, android.util.AttributeSet) (LayoutInflater.java:645)
        at android.view.View android.view.LayoutInflater.createViewFromTag(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet, boolean) (LayoutInflater.java:787)
        at android.view.View android.view.LayoutInflater.createViewFromTag(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet) (LayoutInflater.java:727)
        at void android.view.LayoutInflater.rInflate(org.xmlpull.v1.XmlPullParser, android.view.View, android.content.Context, android.util.AttributeSet, boolean) (LayoutInflater.java:858)
        at void android.view.LayoutInflater.rInflateChildren(org.xmlpull.v1.XmlPullParser, android.view.View, android.util.AttributeSet, boolean) (LayoutInflater.java:821)
        at android.view.View android.view.LayoutInflater.inflate(org.xmlpull.v1.XmlPullParser, android.view.ViewGroup, boolean) (LayoutInflater.java:518)
        at android.view.View android.view.LayoutInflater.inflate(int, android.view.ViewGroup, boolean) (LayoutInflater.java:426)
        at android.view.View android.view.LayoutInflater.inflate(int, android.view.ViewGroup) (LayoutInflater.java:377)
        at android.view.ViewGroup androidx.appcompat.app.AppCompatDelegateImpl.createSubDecor() (AppCompatDelegateImpl.java:607)
        at void androidx.appcompat.app.AppCompatDelegateImpl.ensureSubDecor() (AppCompatDelegateImpl.java:518)
        at void androidx.appcompat.app.AppCompatDelegateImpl.setContentView(int) (AppCompatDelegateImpl.java:466)
        at void androidx.appcompat.app.AppCompatActivity.setContentView(int) (AppCompatActivity.java:140)
        at void com.connectdb.truckish.common.base.BaseActivity.onCreate(android.os.Bundle) (BaseActivity.java:44)
        at void com.connectdb.truckish.MainActivity.onCreate(android.os.Bundle) (MainActivity.java:14)
        at void android.app.Activity.performCreate(android.os.Bundle) (Activity.java:6672)
        at void android.app.Instrumentation.callActivityOnCreate(android.app.Activity, android.os.Bundle) (Instrumentation.java:1140)
        at android.app.Activity android.app.ActivityThread.performLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.content.Intent) (ActivityThread.java:2612)
        at void android.app.ActivityThread.handleLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.content.Intent, java.lang.String) (ActivityThread.java:2724)
        at void android.app.ActivityThread.-wrap12(android.app.ActivityThread, android.app.ActivityThread$ActivityClientRecord, android.content.Intent, java.lang.String) (ActivityThread.java:-1)
        at void android.app.ActivityThread$H.handleMessage(android.os.Message) (ActivityThread.java:1473)
        at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:102)
        at void android.os.Looper.loop() (Looper.java:154)
        at void android.app.ActivityThread.main(java.lang.String[]) (ActivityThread.java:6123)
        at java.lang.Object java.lang.reflect.Method.invoke!(java.lang.Object, java.lang.Object[]) (Method.java:-2)
        at void com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run() (ZygoteInit.java:867)
        at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:757)
Mohan Rex
la source
1
J'ai la même erreur. Avez-vous trouvé des solutions de contournement?
c0nst
Non, je n'ai trouvé aucune solution de contournement.
Mohan Rex
1
J'obtiens une erreur similaire mais non AndroidX Rejecting re-init on previously-failed class java.lang.Class<android.support.v4.view.ViewCompat$OnUnhandledKeyEventListenerWrapper>: java.lang.NoClassDefFoundError: Failed resolution of: Landroid/view/View$OnUnhandledKeyEventListener;. Est-ce une cause différente?
Dale
@Mohan Rex Veuillez m'aider à résoudre ce problème?
Garg's
1
La seule chose qui m'a aidé est de remplacer étend AppCompatActivity par juste Activity dans toutes mes activités. Par exemple, la classe publique MainActivity étend l'activité. Rien d'autre n'a fonctionné pour moi. Après cela, l'avertissement est parti car il est lié à AppCompat dans Android X. Cependant, ce n'est pas la meilleure solution pour la compatibilité descendante
Darksymphony

Réponses:

89

Comme ALFlanagan l'a mentionné dans un commentaire, le problème est qu'il android.support.v4.view.ViewCompatne s'implémente pas View.OnUnhandledKeyEventListenerdans la nouvelle structure de package androidx et ne l'implémente qu'à partir de l'API 28 dans la structure de la bibliothèque de support (au moins dans la version 28.0.0). Par conséquent, l'avertissement apparaît sur les appareils avec API <28 et n'apparaît pas sur ceux> = 28.

Voici le code associé dans la ViewCompat.classclasse de la structure du package de support:

@RequiresApi(28)
private static class OnUnhandledKeyEventListenerWrapper implements OnUnhandledKeyEventListener {
    private ViewCompat.OnUnhandledKeyEventListenerCompat mCompatListener;

    OnUnhandledKeyEventListenerWrapper(ViewCompat.OnUnhandledKeyEventListenerCompat listener) {
        this.mCompatListener = listener;
    }

    public boolean onUnhandledKeyEvent(View v, KeyEvent event) {
        return this.mCompatListener.onUnhandledKeyEvent(v, event);
    }
}

Je ne peux pas penser à une solution facile pour résoudre cet avertissement.

AlvaroSantisteban
la source
14
Le problème a été marqué comme ne résoudra pas et personne ne s'est soucié de donner une explication ou une solution de contournement.
Odys
4
Il semble que le bogue ait été resoumis ici issuetracker.google.com/issues/120750246
aaronmarino
2
Eh bien, mon application ne fonctionne tout simplement pas du tout et je vois juste cette erreur sur mon débogage (Logcat). L'application ne plante pas, mais le "contentView" n'est pas non plus mis à jour, laissant un écran vide.
Iúri dos Anjos
1
J'ai le même problème .. Il ne plante pas mais la vue a un comportement inattendu. Cela a commencé à se produire dès que j'ai mis à niveau le sdk de compilation à 28 de 27.
Amit Kumar
2
Il s'agit d'un crash d'exécution sur chaque appareil avec une API <26
John Sardinha
0

Je pense que c'est un bogue dans androidx. J'ai trouvé que l'erreur provoquait un retard dans les versions de débogage mais ne montrait pas ou ne ralentissait pas les versions de production, donc je l'ai simplement ignorée pour le moment.

Bob Bobbington
la source
J'utilise déjà AppCompatActivity :(. Mais l'erreur apparaît.
Mohan Rex
1
@MohanRex - exactement, ce message apparaît lors de l'utilisation d'AppCompatActivity. Néanmoins, il faut utiliser AppCompatActivity - ignorez simplement ce désagrément inoffensif.
ToolmakerSteve
0

vous pouvez utiliser aspectJ pour annuler ce problème en modifiant le code octet androidx.

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;

@Aspect
public class UnHandleKeyEventAspectJ {
    public static final String TAG="UnHandleKeyEventAspectJ";
    @Pointcut("execution(* androidx.core.view.ViewCompat.setOnApplyWindowInsetsListener(android.view.View, androidx.core.view.OnApplyWindowInsetsListener))")
public void kotlinClassInit() {

}
    @Around("kotlinClassInit()")
    public void addTransaction(ProceedingJoinPoint joinPoint){
        try {
            joinPoint.proceed();
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
    }
}
包 奇 锋
la source
Pouvez-vous expliquer comment faire fonctionner AspectJ avec Android Studio 3.6.3. J'obtiens cette erreur après avoir construit le modèle "Activité de base" en utilisant compileSdkVersion 28, buildToolsVersion 29.0.3, minSdkVersion 16, targetSdkVersion 28.
kbro
-2

Les réponses ci-dessus sont correctes. La seule façon d'éviter cela est de supprimer les références à AppCompat - par exemple, j'ai changé pour FragmentActivity. La mauvaise nouvelle est que les nouvelles bibliothèques de matériaux font toutes référence et rencontrent le problème. Je ne voulais pas que cela se produise à mon démarrage - le succès n'est pas si grave plus tard. Ce n'est qu'un avertissement - mais cela a un impact sur les performances et c'est assez faux et mal géré par le grand G.

Daniel Haywood
la source
1
Re "J'ai changé pour FragmentActivity" . Ce n'est pas une bonne idée - cela signifie que votre application ne fonctionnera pas sur des appareils plus anciens. Restez avec AppCompat. Re "Ce n'est qu'un avertissement - mais cela a un impact sur les performances" - pour clarifier, tout impact sur les performances est négligeable sur la version de la version; c'est principalement un ennui, ajoutant du désordre au début du journal de débogage.
ToolmakerSteve
-3

L'annotation @RequiresApi(28)signifie en fait que la seule build.gradleconfiguration qui permettrait de se débarrasser du journal-spam serait d'élever le minSdkVersionà au moins 28. Considérez-le simplement comme un avertissement qui ne peut pas être mis en sourdine - pas une erreur.

android {    
    defaultConfig {
        targetSdkVersion 28
        compileSdkVersion 28
        minSdkVersion 28
    }
}

Les votes négatifs ne font que prouver à quel point ce site est anti-intellectuel ...

Martin Zeitler
la source
pas si utilisable .. vous ne pouvez pas vous attendre à ce que les utilisateurs aient seulement 28+ ces jours.
zeroDivider
eh bien, ce n'est qu'un avertissement, même si le spam du journal est ennuyeux ... Néanmoins, il pourrait même être possible d'ajouter un modèle d'exclusion d'expression régulière à logcat et simplement filtrer ce message de journal.
Martin Zeitler
minSdkVersion 28 est définitivement trop élevé pour la plupart des applications
Wu Yuan Chun
@WuYuanChun ce n'était pas la question - et c'est la seule réponse qui cache réellement le problème.
Martin Zeitler
Pour clarifier: le changement de minSDK à 28 entraîne une application qui ne fonctionnera pas sur les appareils plus anciens. Droite? Si tel est le cas, cela devrait figurer dans la réponse comme un avertissement important.
ToolmakerSteve
-5

Vous pouvez l'éviter car cette classe spécifique uniquement dans Android 9.

Jonathan
la source
1
Pourriez-vous s'il vous plaît donner plus d'informations. Ce sera très utile.
Mohan Rex
3
Voir developer.android.com/reference/android/view/… . Il semble que ce soit un bogue où android.support.v4.view.ViewCompat n'implémente pas une interface attendue.
AL Flanagan
4
(Au-dessus de la classe est ==> androidx.core.view.ViewCompat) Il y a un rapport de bogue issuetracker.google.com/issues/110162198 qui est marqué "impossible de dupliquer". Vous pouvez envisager de déposer un rapport de bogue avec toutes les informations nécessaires pour reproduire le problème.
AL Flanagan
Thx pour la référence, j'ai étendu le problème dans le tracker avec mon code dans l'espoir qu'ils puissent le reproduire.
findusl