Android:无法访问DrawerLayout中的MenuItem

侯曼

我试图使最后一个MenuItem在“抽屉”菜单中不可见。尽管存在Stackoverflow上现有解决方案,但我还是得到了一个空指针异常,并且不理解它。

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
迈克尔·伦迪

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

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

抓住MenuItem绝对是正确的。但是,标头元素实际上是导航抽屉的单独元素,在这种情况下没有用。相反,我们可以使用实例获取对MenuItemnavView引用。然后,使用与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);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章