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<android.support.v4.view.ViewCompat$OnUnhandledKeyEventListenerWrapper>: 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