AndroidX:Appcompat I:艺术错误 android.view.View$OnUnhandledKeyEventListener

Posted

技术标签:

【中文标题】AndroidX:Appcompat I:艺术错误 android.view.View$OnUnhandledKeyEventListener【英文标题】:AndroidX:Appcompat I:art error android.view.View$OnUnhandledKeyEventListener 【发布时间】:2019-01-17 20:03:23 【问题描述】:

在一个新创建的带有 androidx:appcompat:appcompat:1.0.0-rc01 的项目中,我得到了

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

我还添加了配置。全部

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

这不会影响应用功能或崩溃。但是当应用程序运行时它总是有这个错误。请帮助我解决错误。 整个堆栈跟踪如下。

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)

【问题讨论】:

我有同样的错误。您找到任何解决方法了吗? 不,我没有找到任何解决方法。 我收到了一个类似但非 AndroidX 错误Rejecting re-init on previously-failed class java.lang.Class&lt;android.support.v4.view.ViewCompat$OnUnhandledKeyEventListenerWrapper&gt;: java.lang.NoClassDefFoundError: Failed resolution of: Landroid/view/View$OnUnhandledKeyEventListener;。这是不同的原因吗? @Mohan Rex 请帮我解决这个问题? 唯一对我有帮助的是在我的所有活动中用 Activity 替换 extends AppCompatActivity 。例如。公共类 MainActivity 扩展了 Activity。没有其他东西对我有用。在此之后,警告消失了,因为它与 android X 中的 AppCompat 相关。但是,这不是向后兼容的最佳解决方案 【参考方案1】:

正如 ALFlanagan 在评论中提到的那样,问题是 android.support.v4.view.ViewCompat 没有在新的 androidx 包结构中实现 View.OnUnhandledKeyEventListener 并且仅在支持 lib 结构中的 API 28 开始实现它(至少在版本 28.0.0 )。因此,警告会出现在 API =28 的设备上。

这是来自支持包结构的ViewCompat.class类中的相关代码:

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

我想不出任何简单的方法来解决这个警告。

【讨论】:

该问题已被标记为无法修复,没有人愿意提供解释或解决方法。 好像bug在这里重新提交了issuetracker.google.com/issues/120750246 好吧,我的应用程序根本无法运行,我只是在调试 (Logcat) 中看到了这个错误。应用程序没有崩溃,但“contentView”也没有更新,留下一个空白屏幕。 我遇到了同样的问题。它没有崩溃,但视图有一些意想不到的行为。当我将 compile sdk 从 27 升级到 28 时,它就开始发生了。 这是每台使用 API 的设备上的运行时崩溃 【参考方案2】:

我面临同样的问题,但只是尝试升级 appcompat 的依赖项,但它没有更多的错误日志。我希望很快会有新的稳定版本。 https://developer.android.com/jetpack/androidx/releases/appcompat#1.3.0-alpha02

实现'androidx.appcompat:appcompat:1.3.0-alpha02'

【讨论】:

更新的依赖是:- implementation 'androidx.appcompat:appcompat:1.3.0-alpha02' 为我工作,我在 API 级别 26 上遇到了类似的错误。 这是一个真正的修复,拯救我的一天,谢谢! 完美的【参考方案3】:

您可以使用 aspectJ 通过修改 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();
        
    

【讨论】:

您能否解释一下如何让 AspectJ 与 Android Studio 3.6.3 一起工作。我在使用 compileSdkVersion 28、buildToolsVersion 29.0.3、minSdkVersion 16、targetSdkVersion 28 构建“基本活动”模板时遇到此错误。【参考方案4】:

这是 androidx 中的一个错误。我发现错误会导致调试构建滞后,但不会显示或减慢生产构建。你可以暂时忽略它。

【讨论】:

我已经在使用 AppCompatActivity :( 。但是出现了错误。 @MohanRex - 确切地说,在使用 AppCompatActivity 时会出现此消息。然而,一个应该使用 AppCompatActivity - 忽略这个无害的烦恼。【参考方案5】:

上面的答案是正确的。避免这种情况的唯一方法是删除对 AppCompat 的引用 - 例如我改为 FragmentActivity。坏消息是新素材库全部参考和体验的问题。我不希望这发生在我的创业公司中——后来的打击还不错。这只是一个警告 - 但确实会对性能产生影响,而且它非常虚假且大 G 处理不当。

【讨论】:

重新“我改成了FragmentActivity”。不是一个好主意 - 这意味着您的应用程序将无法在旧设备上运行。继续使用 AppCompat。 Re “这只是一个警告 - 但确实会影响性能” - 澄清一下,任何性能影响对发布版本都可以忽略不计;这主要是一个烦恼,在调试日志的开头增加了混乱。【参考方案6】:

注释@RequiresApi(28) 实际上意味着,唯一可以摆脱日志垃圾邮件的build.gradle 配置是将minSdkVersion 提高到至少28

android     
    defaultConfig 
        targetSdkVersion 28
        compileSdkVersion 28
        minSdkVersion 28
    

来自错误跟踪器:

此错误已作为 Won't Fix (Intended Behavior) 关闭,这些错误可以忽略。

【讨论】:

不太好用.. 你不能指望用户现在只有 28 岁以上。 好吧,这只是一个警告,即使日志垃圾邮件很烦人......不过,甚至可以向 logcat 添加正则表达式排除模式并简单地过滤掉该日志消息。跨度> minSdkVersion 28 对于大部分APP来说肯定太高了 澄清一下:将 minSDK 更改为 28 会导致应用无法在旧设备上运行。正确的?如果是这样,那应该作为一个突出的警告出现在答案中。 @ToolmakerSteve 这只是一个可悲的现实,这里的大多数人只是复制,粘贴和投票最简单的解决方法(而不是解决方案),而不了解他们复制的内容 - 然后想知道他们何时会遇到更多问题。我已经解释了它为什么会发生以及如何处理它 - 或者只是忽略它(它无法解决似乎不是一个可以接受的答案)。向后兼容性不是问题。没有最少解决方案的 91 票赞成...【参考方案7】:

您可以避免它,因为该特定类仅在 Android 9 中。

【讨论】:

您能否提供更多信息。这将非常有帮助。 见developer.android.com/reference/android/view/…。看起来这是一个错误,其中 android.support.v4.view.ViewCompat 没有实现预期的接口。 (上面的类是 ==> androidx.core.view.ViewCompat) 有一个错误报告issuetracker.google.com/issues/110162198 被标记为“无法复制”。您可能需要考虑提交一份错误报告,其中包含重现问题所需的所有信息。 Thx 作为参考,我用我的代码扩展了跟踪器中的问题,希望他们可以重现它。

以上是关于AndroidX:Appcompat I:艺术错误 android.view.View$OnUnhandledKeyEventListener的主要内容,如果未能解决你的问题,请参考以下文章

androidx.appcompat.widget.SearchView 无法转换为 androidx.core.view.ActionProvider

类型 androidx.appcompat.resources.R$dimen 被定义了多次

发生膨胀异常 'androidx.appcompat:appcompat:1.1.0'

AndroidX迁移-androidx.legacy:legacy-support-v4或androidx.appcompat:appcompat

android x 设计依赖

androidx.appcompat.widget.AppCompatTextView 与 API < 26 不兼容