AndroidX: Appcompat I: errore artistico android.view.View $ OnUnhandledKeyEventListener


105

In un progetto appena creato con Androidx: appcompat: appcompat: 1.0.0-rc01, ottengo il file

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

Avevo anche aggiunto configuration.all

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

Questo non influisce sulla funzionalità dell'app o si arresta in modo anomalo. Ma ha sempre questo errore quando l'app è in esecuzione. Gentilmente aiutami a risolvere l'errore. L'intera traccia dello stack è la seguente.

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
Ho lo stesso errore. Hai trovato soluzioni alternative?
— c0nst

No, non ho trovato alcuna soluzione alternativa.
— Mohan Rex

1
Ricevo un errore simile ma 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;. È una causa diversa?
— Dale

@ Mohan Rex Per favore aiutami a risolvere questo problema?
— Garg's

1
L'unica cosa che mi ha aiutato è sostituire extends AppCompatActivity con solo Activity in tutte le mie attività. Ad esempio, la classe pubblica MainActivity estende Activity. Nient'altro ha funzionato per me. Dopodiché l'avviso è scomparso poiché è correlato ad AppCompat in Android X. Tuttavia, non è la soluzione migliore per la compatibilità con le versioni precedenti
— Darksymphony

Risposte:


88

Come ALFlanagan ha menzionato in un commento, il problema è che android.support.v4.view.ViewCompatnon viene implementato View.OnUnhandledKeyEventListenernella nuova struttura del pacchetto androidx e lo implementa solo a partire dall'API 28 nella struttura della libreria di supporto (almeno nella versione 28.0.0). Pertanto l'avviso compare sui dispositivi con API <28 e non compare su quelli> = 28.

Questo è il codice correlato nella ViewCompat.classclasse dalla struttura del pacchetto di supporto:

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

Non riesco a pensare a una soluzione semplice per risolvere questo avvertimento.


14
Il problema è stato contrassegnato come non risolto e nessuno si è preoccupato di fornire una spiegazione o una soluzione alternativa.
— Odys

4
Sembra che il bug sia stato ripresentato qui issuetracker.google.com/issues/120750246
— aaronmarino

2
Bene, la mia app non funziona affatto e vedo questo errore sul mio debug (Logcat). L'app non si blocca, ma anche "contentView" non viene aggiornato, lasciando uno schermo vuoto.
— Iúri dos Anjos

1
Sto riscontrando lo stesso problema .. Non si blocca ma la vista sta avendo un comportamento imprevisto. Ha iniziato a succedere non appena ho aggiornato l'SDK di compilazione a 28 dal 27.
— Amit Kumar

2
Si tratta di un arresto anomalo del runtime su ogni dispositivo con API <26
— John Sardinha


0

Penso che questo sia un bug in androidx. Ho scoperto che l'errore causa ritardi nelle build di debug ma non mostra o rallenta le build di produzione, quindi per ora l'ho ignorato.


Sto già utilizzando AppCompatActivity :(. Ma viene visualizzato l'errore.
— Mohan Rex

1
@MohanRex - esattamente, questo messaggio viene visualizzato quando si utilizza AppCompatActivity. Tuttavia, si dovrebbe usare AppCompatActivity - basta ignorare questo fastidio innocuo.
— ToolmakerSteve

0

puoi usare aspectJ per annullare questo problema modificando il codice byte 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();
        }
    }
}

Puoi spiegare come far funzionare AspectJ con Android Studio 3.6.3. Ricevo questo errore dopo aver creato il modello "Attività di base" utilizzando compileSdkVersion 28, buildToolsVersion 29.0.3, minSdkVersion 16, targetSdkVersion 28.
— kbro

-2

Le risposte di cui sopra sono corrette. L'unico modo per evitare ciò è rimuovere i riferimenti ad AppCompat, ad esempio ho cambiato in FragmentActivity. La cattiva notizia è che le nuove librerie di materiali fanno riferimento e sperimentano il problema. Non volevo che ciò accadesse al mio avvio: il successo non è poi così male in seguito. È solo un avvertimento, ma ha un impatto sulle prestazioni ed è piuttosto fasullo e mal gestito dal grande G.


1
Ri "Ho cambiato in FragmentActivity" . Non è una buona idea: significa che la tua app non funzionerà su dispositivi meno recenti. Resta con AppCompat. Ri "È solo un avvertimento - ma ha un impatto sulle prestazioni" - per chiarire, qualsiasi impatto sulle prestazioni è trascurabile sulla build di rilascio; questo è principalmente un fastidio, aggiungendo confusione all'inizio del registro di debug.
— ToolmakerSteve

-3

L'annotazione in @RequiresApi(28)realtà significa che l'unica build.gradleconfigurazione che eliminerebbe il log-spam sarebbe quella di aumentare il valore minSdkVersionalmeno a 28. Consideralo solo come un avviso che non può essere disattivato, non come un errore.

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

I voti negativi dimostrano quanto sia anti-intellettuale questo sito ...


non così utilizzabile .. non puoi aspettarti che gli utenti abbiano solo 28+ in questi giorni.
— zeroDivider

beh, è ​​solo un avvertimento, anche se il log-spam è fastidioso ... tuttavia potrebbe anche essere possibile aggiungere un pattern di esclusione regex a logcat e filtrare semplicemente quel messaggio di log.
— Martin Zeitler

minSdkVersion 28 è decisamente troppo alto per la maggior parte di APP
— Wu Yuan Chun

@WuYuanChun questa non era la domanda - e questa è l'unica risposta che effettivamente nasconde il problema.
— Martin Zeitler

Per chiarire: la modifica di minSDK a 28 risulta in un'app che non verrà eseguita sui dispositivi meno recenti. Destra? Se è così, dovrebbe essere nella risposta un avvertimento evidente.
— ToolmakerSteve

-5

Puoi evitarlo perché quella classe specifica solo in Android 9.


1
Potresti fornire maggiori informazioni. Sarebbe di grande aiuto.
— Mohan Rex

3
Vedi developer.android.com/reference/android/view/… . Sembra che questo sia un bug in cui android.support.v4.view.ViewCompat non implementa un'interfaccia prevista.
— AL Flanagan

4
(La classe sopra è ==> androidx.core.view.ViewCompat) C'è una segnalazione di bug issuetracker.google.com/issues/110162198 contrassegnata come "impossibile duplicare". Potresti prendere in considerazione l'idea di presentare una segnalazione di bug con tutte le informazioni necessarie per riprodurre il problema.
— AL Flanagan

Grazie per il riferimento, ho esteso il problema nel tracker con il mio codice nella speranza che possano riprodurlo.
— findusl
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.