【问题标题】:Android: Can't access MenuItem in DrawerLayoutAndroid:无法访问 DrawerLayout 中的 MenuItem
【发布时间】:2021-01-25 06:03:33
【问题描述】:

我正在尝试使最后一个 MenuItem 在抽屉菜单中不可见。尽管 Stackoverflow 上有 existing solutions,但我得到一个空指针异常并且不明白。

navdrawer_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/faq_id"
        android:icon="@drawable/contact_support_24px"
        android:title="@string/frequently_asked_questions" />
    <item
        android:id="@+id/support_id"
        android:icon="@drawable/email_24px"
        android:title="@string/support_suggestions" />
    <item
        android:id="@+id/news_twitter_id"
        android:icon="@drawable/twitter"
        android:title="@string/news_twitter" />
    <item
        android:id="@+id/news_facebook_id"
        android:icon="@drawable/facebook_24px"
        android:title="@string/news_facebook" />
    <item
        android:id="@+id/signout_id"
        android:icon="@drawable/logout"
        android:title="@string/sign_out" />
</menu>

活动布局:

<layout>
    <androidx.drawerlayout.widget.DrawerLayout
        <LinearLayout
            <fragment/>
        </LinearLayout>

        <com.google.android.material.navigation.NavigationView
            android:id="@+id/navViewVpn"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            app:headerLayout="@layout/nav_header"
            app:menu="@menu/navdrawer_menu" />
    </androidx.drawerlayout.widget.DrawerLayout>
</layout>

活动代码:

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val navView: NavigationView = findViewById(R.id.navViewVpn)
        val i = navView.headerCount // 1
        val header: View = navView.getHeaderView(0)
        val signout: MenuItem = header.findViewById(R.id.signout_id) // Crash
}

崩溃在最后一行,它甚至找不到标题下的signout_id。但为什么呢?

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.company.App.vpn.android, PID: 12008
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.company.App.vpn.android/com.company.App.vpn.android.VpnActivity}: java.lang.NullPointerException: header.findViewById(R.id.signout_id) must not be null
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
        at android.app.ActivityThread.access$800(ActivityThread.java:135)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:136)
        at android.app.ActivityThread.main(ActivityThread.java:5017)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
        at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.NullPointerException: header.findViewById(R.id.signout_id) must not be null

【问题讨论】:

    标签: android kotlin


    【解决方案1】:

    在这一行中,我们尝试将 View 实例分配给 MenuItem 类型的变量。 MenuItem 没有扩展 View(因此不存在),所以这个赋值给我们带来了一些麻烦。

    val signout: MenuItem = header.findViewById(R.id.signout_id)
    

    抓住 MenuItem 绝对是正确的。但是,标题元素实际上是导航抽屉的一个单独元素,在这种情况下没有用。相反,我们可以使用 navView 实例获取对 MenuItem 的引用。然后,使用findItem 方法,而不是findViewById

    从那里可以根据需要以编程方式编辑菜单项。

    override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            val navView: NavigationView = findViewById(R.id.navViewVpn)
    
            val signout: MenuItem = navView.menu.findItem(R.id.signout_id);
            
            // Edit the menu item as required
            signout.isVisible = false;
    }
    

    注意,对于任何在 Java 中执行此操作的人,等效代码如下。

    NavigationView navView = findViewById(R.id.nav_view_id);
    MenuItem item = navView.getMenu().findItem(R.id.navItemId);
    

    【讨论】:

      猜你喜欢
      • 2021-12-23
      • 2023-04-07
      • 2013-06-07
      • 2017-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-19
      相关资源
      最近更新 更多