android - 来自 xml 的 NavigationView onClick 导致错误

标签 android navigation-drawer android-resources android-design-library navigationview

使用新发布的 Android 支持设计库中的 NavigationView,如果导航标题布局包含 onClick(在 xml 中),onClick 事件会使应用程序崩溃。可以通过 view.onClickListener(而不是 xml)以编程方式添加 OnClick,然后点击工作正常。但是由于某些原因,每当使用xml onClick时,都会出错。

这是我的主要布局:

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/mainActivityLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true">

    <RelativeLayout
        android:id="@+id/mainContentFrame"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        ...

    </RelativeLayout>

    <android.support.design.widget.NavigationView
        android:id="@+id/drawerNavView"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:fitsSystemWindows="true"
        app:headerLayout="@layout/drawer_header"
        app:menu="@menu/drawer_menu">

    </android.support.design.widget.NavigationView>

</android.support.v4.widget.DrawerLayout>

在我的 Activity 中,我的菜单项点击(使用 navView.setNavigationItemSelectedListener() 添加)工作正常。问题是单击标题时:

drawer_header.xml:

...

<View
    android:id="@+id/testButton"
    android:layout_width="match_parent"
    android:layout_height="60dp"
    android:onClick="testButtonClick"/>

...

产生以下错误:

java.lang.IllegalStateException: Could not find a method testButtonClick(View) 
in the activity class android.view.ContextThemeWrapper for onClick handler
on view class android.view.View with id 'testButton'

更新

NavigationView 可以使用标准的 Menu 资源文件,但是如果使用来自菜单 XML 资源的 onClick 也会有类似的问题。根据Menu Resource reference , android:onClick 属性会覆盖正常的回调。这通常可以很好地工作,但对于 NavigationView 中的菜单项,它不会。相反,它因以下错误而崩溃:

java.lang.RuntimeException: Unable to start activity ComponentInfo{...}:
android.view.InflateException: Binary XML file line #34: 
Error inflating class android.support.design.widget.NavigationView

当我删除 XML onClick 时,错误消失了。

更新

我使用“官方”demo project 测试了 xml onClick适用于 Android 设计库。相同的结果:将 onClick(在 xml 中)添加到 NavigationView 的菜单或标题会导致应用程序崩溃。所以这似乎是 NavigationView 的错误。

在 v23.1 中解决

谷歌发布a fix对于支持库 v23.1 中的这些 XML onClick 错误。

最佳答案

已确认,这是支持库中的错误。

显然它与 ContextThemeWrapper 有关,并且根据此 bug report ,支持库 22.1 中存在该问题。

所以,简短的回答是:

在修复之前,不要将 XML onClick 与 NavigationView(或其他一些组件,如 EditText)一起使用。

解决方法:

在代码中设置点击监听器。对于 NavigationView,使用 setNavigationItemSelectedListener()

更新:此错误已修复

您现在可以在支持库 23.1 (bug report) 中使用 XML onClick。我已经验证它在我的应用程序中有效。但是 v23.1 中的 NavView 似乎还有其他(较新的)XML 问题(见下文),即使这个特定的 onClick 错误现在已修复。

为了完整性:

在通过 XML 扩展 NavigationView header 时,似乎存在另一个(相关的?)错误。使用 XML app:headerLayout 会产生 23.1 错误,即使 XML onClick 现在可以正常工作。由于这个通货膨胀问题,您需要在代码中使用 NavigationView.inflateHeaderView() 方法。这个新方法是在 23.1 中添加的,显然,以前的 XML inflate 现在已经被破坏了(或者他们可能在没有告诉任何人的情况下弃用了 app:headerLayout?)。更多资讯详解here .

关于android - 来自 xml 的 NavigationView onClick 导致错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30553197/

相关文章:

android - 如何引用资源值中的 ?attr/actionBarSize?

具有版本配置的 Android 布局无法正常工作

android - 如何在 Android 的 HTML 电子邮件中包含图像

android - 抽屉导航中的 ScrollView

android - R.java 背后的概念是什么?

android - 为 Nav Drawer 中的 Android 状态栏着色

android - 调用 isDrawerOpen 时抽屉导航崩溃

java - OkHttp 对请求启用/禁用 gzip 压缩

java - 折线在模拟器上崩溃

android - 哪些权限需要手动更新?