AndroidX: Appcompat I: Kunstfehler android.view.View $ OnUnhandledKeyEventListener


104

In einem neu erstellten Projekt mit Androidx: appcompat: appcompat: 1.0.0-rc01 bekomme ich das

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

Ich hatte auch configuration.all hinzugefügt

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

Dieser hat keinen Einfluss auf die App-Funktionalität oder stürzt ab. Aber es hat immer diesen Fehler, wenn die App ausgeführt wird. Bitte helfen Sie mir, den Fehler zu beheben. Die gesamte Stapelverfolgung ist wie folgt.

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)

1
Ich habe den gleichen Fehler. Haben Sie Problemumgehungen gefunden?
13.

Nein, ich habe keine Problemumgehung gefunden.
Mohan Rex

1
Ich erhalte einen ähnlichen, aber nicht AndroidX-Fehler 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;. Ist das eine andere Ursache?
Dale

@ Mohan Rex Bitte helfen Sie mir, dieses Problem zu beheben.
Garg

Das einzige, was mir geholfen hat, ist, AppCompatActivity bei all meinen Aktivitäten durch nur Aktivität zu ersetzen. Beispielsweise erweitert MainActivity der öffentlichen Klasse die Aktivität. Sonst hat bei mir nichts funktioniert. Danach ist die Warnung weg, da sie mit AppCompat in Android X zusammenhängt. Allerdings nicht die beste Lösung für die Abwärtskompatibilität
Darksymphony

Antworten:


86

Wie ALFlanagan in einem Kommentar erwähnt hat, besteht das Problem darin, dass android.support.v4.view.ViewCompates nicht View.OnUnhandledKeyEventListenerin der neuen AndroidX-Paketstruktur implementiert wird und es erst ab API 28 in der Support-Lib-Struktur implementiert (zumindest in Version 28.0.0). Daher wird die Warnung auf Geräten mit API <28 und nicht auf Geräten> = 28 angezeigt.

Dies ist der zugehörige Code in der ViewCompat.classKlasse aus der Support Package-Struktur:

@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);
    }
}

Ich kann mir keine einfache Lösung vorstellen, um diese Warnung zu lösen.


14
Das Problem wurde als nicht behebbar markiert, und niemand wollte eine Erklärung oder eine Problemumgehung geben.
Odys

4
Es scheint, dass der Fehler hier erneut gemeldet
aaronmarino

2
Nun, meine App funktioniert überhaupt nicht und ich sehe diesen Fehler nur bei meinem Debug (Logcat). Die App stürzt nicht ab, aber die "contentView" wird ebenfalls nicht aktualisiert, sodass ein leerer Bildschirm verbleibt.
Iúri dos Anjos

1
Ich habe das gleiche Problem. Es stürzt nicht ab, aber die Ansicht zeigt ein unerwartetes Verhalten. Es beginnt, sobald ich das Compile SDK von 27 auf 28 aktualisiert habe.
Amit Kumar

2
Dies ist ein Laufzeitabsturz auf jedem Gerät mit API <26
John Sardinha


0

Ich denke, das ist ein Fehler in AndroidX. Ich habe festgestellt, dass der Fehler zu Verzögerungen bei Debug-Builds führt, aber keine Produktions-Builds anzeigt oder verlangsamt. Daher habe ich ihn vorerst ignoriert.


Ich benutze bereits AppCompatActivity :(. Aber der Fehler erscheint.
Mohan Rex

1
@MohanRex - genau diese Meldung wird angezeigt, wenn AppCompatActivity verwendet wird. Trotzdem sollte man AppCompatActivity verwenden - ignorieren Sie einfach diesen harmlosen Ärger.
ToolmakerSteve

0

Sie können Aspekt J verwenden, um dieses Problem zu beheben, indem Sie den AndroidX-Bytecode ändern.

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();
        }
    }
}

Können Sie bitte erklären, wie AspectJ mit Android Studio 3.6.3 funktioniert? Ich erhalte diesen Fehler, wenn ich die Vorlage "Basic Activity" mit compileSdkVersion 28, buildToolsVersion 29.0.3, minSdkVersion 16, targetSdkVersion 28 erstellt habe.
kbro

-2

Die obigen Antworten sind richtig. Die einzige Möglichkeit, dies zu vermeiden, besteht darin, Verweise auf AppCompat zu entfernen - z. B. habe ich zu FragmentActivity gewechselt. Die schlechte Nachricht ist, dass die neuen Materialbibliotheken alle auf das Problem verweisen und es erleben. Ich wollte nicht, dass dies bei meinem Start auftritt - der Treffer ist später nicht so schlimm. Es ist nur eine Warnung - hat aber einen Einfluss auf die Leistung und ist ziemlich falsch und wird vom großen G schlecht gehandhabt.


1
Zu "Ich habe zu FragmentActivity gewechselt" . Keine gute Idee - das bedeutet, dass Ihre App nicht auf älteren Geräten ausgeführt werden kann. Bleiben Sie bei AppCompat. Betreff "Es ist nur eine Warnung - hat aber Auswirkungen auf die Leistung" - um zu verdeutlichen, dass die Auswirkungen auf die Leistung beim Release-Build vernachlässigbar sind. Dies ist hauptsächlich ärgerlich und führt zu Unordnung am Anfang des Debug-Protokolls.
ToolmakerSteve

-3

Die Annotation @RequiresApi(28)bedeutet tatsächlich, dass die einzige build.gradleKonfiguration, die den Log-Spam loswerden würde, darin besteht, die minSdkVersionauf mindestens zu erhöhen 28. Betrachten Sie es einfach als eine Warnung, die nicht stummgeschaltet werden kann - kein Fehler.

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

Die Abstimmungen beweisen nur, wie antiintellektuell diese Seite ist ...


nicht so brauchbar .. Sie können nicht erwarten, dass Benutzer heutzutage nur 28+ haben.
zeroDivider

Nun, es ist nur eine Warnung, selbst wenn der Protokoll-Spam ärgerlich ist. Dennoch kann es möglich sein, logcat ein Regex-Ausschlussmuster hinzuzufügen und diese Protokollnachricht einfach herauszufiltern.
Martin Zeitler

minSdkVersion 28 ist definitiv zu hoch für die meisten APP
Wu Yuan Chun

@ WuYuanChun das war nicht die Frage - und dies ist die einzige Antwort, die das Problem tatsächlich verbirgt.
Martin Zeitler

Zur Verdeutlichung: Wenn Sie minSDK auf 28 ändern, wird eine App ausgeführt, die auf älteren Geräten nicht ausgeführt werden kann. Richtig? Wenn ja, sollte dies in der Antwort als prominente Warnung stehen.
ToolmakerSteve

-5

Sie können es vermeiden, weil diese bestimmte Klasse nur in Android 9.


1
Könnten Sie bitte weitere Informationen geben. Es wird sehr hilfreich sein.
Mohan Rex

3
Siehe developer.android.com/reference/android/view/… . Es sieht so aus, als wäre dies ein Fehler, bei dem android.support.v4.view.ViewCompat keine erwartete Schnittstelle implementiert.
AL Flanagan

4
(Über der Klasse steht ==> androidx.core.view.ViewCompat) Es gibt einen Fehlerbericht issuetracker.google.com/issues/110162198, der als "nicht duplizierbar" markiert ist. Möglicherweise möchten Sie einen Fehlerbericht mit allen Informationen einreichen, die zur Reproduktion des Problems erforderlich sind.
AL Flanagan

Als Referenz habe ich das Problem im Tracker mit meinem Code erweitert, in der Hoffnung, dass sie es reproduzieren können.
Findusl
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.