Android 安卓:Can';无法访问抽屉布局中的菜单项

Android 安卓:Can';无法访问抽屉布局中的菜单项,android,kotlin,Android,Kotlin,我想让最后一个菜单项在抽屉菜单中不可见。尽管存在堆栈溢出,我还是得到了一个空指针异常,我不理解它 navdrawer\u menu.xml <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id=&

我想让最后一个菜单项在抽屉菜单中不可见。尽管存在堆栈溢出,我还是得到了一个空指针异常,我不理解它

navdrawer\u 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>
崩溃发生在最后一行,它甚至找不到标题下的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

在这一行中,我们试图将视图实例分配给MenuItem类型的变量。MenuItem不扩展视图(因此不存在),因此此任务给我们带来了一些麻烦

val signout: MenuItem = header.findViewById(R.id.signout_id)
抓住那个菜单绝对是正确的。但是,header元素实际上是导航抽屉的一个单独元素,在本例中没有用处。相反,我们可以使用
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中执行此操作的任何人,等效代码如下所示

val signout: MenuItem = header.findViewById(R.id.signout_id)
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;
}
NavigationView navView = findViewById(R.id.nav_view_id);
MenuItem item = navView.getMenu().findItem(R.id.navItemId);