android.view.View$OnUnhandledKeyEventListener

66

我是 Android Studio 的新手,不明白为什么我的工具栏没有像 https://developer.android.com/training/appbar/setting-up 描述的那样显示。

我知道在 stackoverflow 上已经有些类似于我这样的问题,但它们在我的项目中不起作用。因此,如果可以解决这个问题,我将非常感激。屏幕截图:

屏幕截图

java.lang.ClassNotFoundException: android.view.View$OnUnhandledKeyEventListener
at org.jetbrains.android.uipreview.ModuleClassLoader.load(ModuleClassLoader.java:180)
at com.android.tools.idea.rendering.RenderClassLoader.findClass(RenderClassLoader.java:61)
at org.jetbrains.android.uipreview.ModuleClassLoader.findClass(ModuleClassLoader.java:118)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at org.jetbrains.android.uipreview.ModuleClassLoader.loadClass(ModuleClassLoader.java:213)
at android.support.v7.widget.ViewUtils.isLayoutRtl(ViewUtils.java:58)
at android.support.v7.widget.Toolbar.onMeasure_Original(Toolbar.java:1578)
at android.support.v7.widget.Toolbar.onMeasure(Toolbar.java)
at android.view.View.measure_Original(View.java:22071)
at android.view.View_Delegate.measure(View_Delegate.java:80)
at android.view.View.measure(View.java:22035)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6602)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at android.view.View.measure_Original(View.java:22071)
at android.view.View_Delegate.measure(View_Delegate.java:80)
at android.view.View.measure(View.java:22035)
at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:715)
at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:461)
at android.view.View.measure_Original(View.java:22071)
at android.view.View_Delegate.measure(View_Delegate.java:80)
at android.view.View.measure(View.java:22035)
at com.android.layoutlib.bridge.impl.RenderSessionImpl.measureView(RenderSessionImpl.java:590)
at com.android.layoutlib.bridge.impl.RenderSessionImpl.inflate(RenderSessionImpl.java:343)
at com.android.layoutlib.bridge.Bridge.createSession(Bridge.java:384)
at com.android.tools.idea.layoutlib.LayoutLibrary.createSession(LayoutLibrary.java:193)
at com.android.tools.idea.rendering.RenderTask.createRenderSession(RenderTask.java:544)
at com.android.tools.idea.rendering.RenderTask.lambda$inflate$3(RenderTask.java:678)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)

工具栏.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/colorPrimaryDark">

</android.support.v7.widget.Toolbar>

构建.gradle(应用级别)

apply plugin: 'com.android.application'
android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.example.david.gamebase"
        minSdkVersion 21
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:28.0.0-rc01'
    implementation 'com.android.support.constraint:constraint-layout:1.1.2'
    implementation 'com.google.firebase:firebase-auth:11.6.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

apply plugin: 'com.google.gms.google-services'

样式.xml:

   <resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Base.Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

</resources>

## toolbar.xml ##

    <?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/colorPrimaryDark">

</android.support.v7.widget.Toolbar>

你能否粘贴一下你使用包含工具栏的布局的活动源代码? - Qasim
布局本身没有正常工作。当我打开res文件夹中的xml文件时,它没有在预览中显示。 - David Schmidt
9个回答

16

如果使用 Android X 和 androidx.core:core 和/或 androidx.appcompat:appcompat,请将 androidx.core:core 更新至 1.4.0-alpha01,并将 androidx.appcompat:appcompat 更新至 1.3.0-alpha01


这对我有用。在我的情况下,我正在使用MaterialToolbar,似乎是引起问题的原因之一。我只使用androidx.appcompat:appcompat,并按照所述从1.1.0更新到1.3.0-alpha01。同步项目后问题得到解决。 - FraK
1
将版本更新为“com.google.android.material:material:1.4.0”对我很有效。我之前使用的是1.3.0版本,但该版本导致了错误。在这个材料更新中,他们将androix.core从1.2.0更新到了1.5.0。 - Luciano Brum

15

请在您的 build.gradle (应用级别) 中进行以下更改,将版本降级为27。然后同步并构建项目。希望这将解决问题。

compileSdkVersion 27

targetSdkVersion 27

implementation 'com.android.support:appcompat-v7:27.1.1'

4
当时它是最好的解决方案,但现在有更好的选择:升级到Android Studio 3.2。 - mhsmith
2
@TatiOverflow 如果不是解决方案,你必须告诉正确的解决方案。 - sasikumar
3
@mhsmith,我在使用Android Studio 3.4.1时仍然遇到了这个问题。 - Akaisteph7
3
降级不再是一个解决方案。我正在使用Android Studio 3.6.3,仍然遇到这个问题。 - Anbuselvan Rocky
1
我遇到了同样的问题,通过您的解决方案已经解决了。但是,我正在使用AndroidX库,在将compileSdkVersion设置为27后,出现了错误"> Task:app:processDebugResources FAILED AGPBI:{"kind":"error","text":"Android资源链接失败"... ",除非我将compileSdkVersion设置为28或更高版本。顺便说一下,我是新手使用Android Studio! - Nguyen Ha Minh
显示剩余2条评论

7

文档所述,首先你的Activity应该继承自AppCompatActivity()

其次,在你的项目styles中,设置了Base.Theme.AppCompat.Light.DarkActionBar这意味着它有一个DarkActionBar,但是你已经在你的layout中拥有了一个Toolbar。因此,简单地改变:

Base.Theme.AppCompat.Light.DarkActionBar

to:

Theme.AppCompat.Light.NoActionBar

接下来,在 Java-Kotlin 侧,设置 Toolbar

// Note that the Toolbar defined in the layout has the id "my_toolbar"
    setSupportActionBar(findViewById(R.id.my_toolbar))

Toolbar 添加一个 id。

<android.support.v7.widget.Toolbar
   android:id="@+id/my_toolbar"
   android:layout_width="match_parent"
   android:layout_height="?attr/actionBarSize"
   android:background="?attr/colorPrimary"
   android:theme="@style/ThemeOverlay.AppCompat.ActionBar"
   app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>

那么你就可以开始了。

2
将DarkActionBar更改为NoActionBar的注释对我有帮助,使得我可以在针对API 28并使用androidx包时让UI预览器正常工作。据我所知,没有工具栏(由AS 3.0.1生成的全新项目),但是OP提到的异常是相当奇怪的“java.lang.ClassNotFoundException:android.view.View $ OnUnhandledKeyEventListener”。 - CCJ
更改Theme.AppCompat.Light.DarkActionBar解决了我的activity_main的错误,但破坏了我的settings_activity - Elijah Mock

7

https://github.com/DonaldDu/FixUnhandledEvent

android.view.View$OnUnhandledKeyEventListener是在api28中添加的。

如果运行设备低于28,则找不到该类,但可以正常运行而没有致命错误。

我们可以在调试模式下注入该类以忽略错误消息。

implementation 'com.android.support:appcompat-v7:28.0.0'
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
//inject class when api<28 && debug==true
debugImplementation 'com.github.DonaldDu:FixUnhandledEvent:1.0'

6
回答一个如此流行的问题时,稍作解释会更加受欢迎。 - Léa Gris

4

1
添加建议的Gradle依赖项解决了我的问题。最新版本的AndroidX Core可以在此处找到:https://developer.android.com/jetpack/androidx/releases/core - dazed

4

这并不是一个错误,而是一个警告。可以通过在我的build.gradle(应用程序级别)文件中添加以下代码来忽略它,这在我的情况下可以工作。然后同步和构建项目。希望能解决问题。

configurations.all {
  resolutionStrategy.eachDependency { DependencyResolveDetails details ->
    def requested = details.requested
    if (requested.group == "com.android.support") {
        if (!requested.name.startsWith("multidex")) {
            details.useVersion "26.+"
        }
    }
  }
}

参考代码链接


0
将Multidex支持库添加到您的依赖项。
com.android.support:multidex:1.0.3

0

关于库 ~-v7:28.0.0 存在问题。有两种解决方案,您可以下载编译并将 targetSdkVersion 设置为 27,或者升级 Android Studio 到最新版本(3.2.x 或更高版本)。


24
不行,我有安装Android Studio 3.2.1版本,但仍然出现这个错误。 - Gene S

-1

你可以很容易地修复它,

implementation 'com.android.support:appcompat-v7:28.0.0-alpha1'

打开values文件夹下的style.xml并修改为

style name="AppTheme" parent="Base.Theme.AppCompat.Light.DarkActionBar">

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接