以编程方式更改菜单项在android中不起作用

以编程方式更改菜单项在android中不起作用,android,android-layout,menuitem,Android,Android Layout,Menuitem,我有一个菜单项,我想以编程方式更改其可见性。菜单是这样的 <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/pencil" android:orderInCategory="100" android:s

我有一个菜单项,我想以编程方式更改其可见性。菜单是这样的

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" > 
     <item
        android:id="@+id/pencil"
        android:orderInCategory="100"
        android:showAsAction="always"
        android:visible="true"
        android:title="@string/for_pencil"/>

</menu>
错误:

E/AndroidRuntime(13845): FATAL EXCEPTION: main
E/AndroidRuntime(13845): java.lang.ClassCastException: com.android.internal.view.menu.ActionMenuItemView cannot be cast to android.view.MenuItem
// This is where I want to change the menu. Can be anywhere in your activity.
invalidateOptionsMenu();

有什么帮助吗?

因为您没有提供任何其他代码,所以我不能说太多

但是,无论何时要更改菜单,都应调用
invalidateOptionsMenu()
。它的作用是使菜单无效,从而强制重新创建菜单。在其重新创建期间,其中一个回调是
onprepareOptions菜单(菜单菜单)
。这是您可以更改菜单的地方

示例:

E/AndroidRuntime(13845): FATAL EXCEPTION: main
E/AndroidRuntime(13845): java.lang.ClassCastException: com.android.internal.view.menu.ActionMenuItemView cannot be cast to android.view.MenuItem
// This is where I want to change the menu. Can be anywhere in your activity.
invalidateOptionsMenu();
然后覆盖此方法

// Override this method to do what you want when the menu is recreated
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    menu.findItem(R.id.pencil).setVisible(false);
    return super.onPrepareOptionsMenu(menu);
}

因为您没有提供任何其他代码,所以我不能对此说太多

但是,无论何时要更改菜单,都应调用
invalidateOptionsMenu()
。它的作用是使菜单无效,从而强制重新创建菜单。在其重新创建期间,其中一个回调是
onprepareOptions菜单(菜单菜单)
。这是您可以更改菜单的地方

示例:

E/AndroidRuntime(13845): FATAL EXCEPTION: main
E/AndroidRuntime(13845): java.lang.ClassCastException: com.android.internal.view.menu.ActionMenuItemView cannot be cast to android.view.MenuItem
// This is where I want to change the menu. Can be anywhere in your activity.
invalidateOptionsMenu();
然后覆盖此方法

// Override this method to do what you want when the menu is recreated
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    menu.findItem(R.id.pencil).setVisible(false);
    return super.onPrepareOptionsMenu(menu);
}

通过工具栏访问菜单的方式,以及无需指定变量的方式:

MenuItem menuItem = ((Toolbar)findViewById(R.id.toolbar)).getMenu().findItem(R.id.pencil);
menuItem.setVisible(true);

通过工具栏访问菜单的方式,以及无需指定变量的方式:

MenuItem menuItem = ((Toolbar)findViewById(R.id.toolbar)).getMenu().findItem(R.id.pencil);
menuItem.setVisible(true);

如果在活动中添加菜单,则需要使菜单无效。当它被重新创建时,您只是不添加您想要的项目。如果是从资源文件中,我假设您加载了菜单,在将其添加到活动之前,您可以删除或隐藏不需要的部分。重写OnCreateOptions菜单(菜单菜单菜单)活动的菜单句柄。如果在活动上以友好方式添加菜单,则需要使菜单无效。当它被重新创建时,您只是不添加您想要的项目。如果是从资源文件中,我假设您加载了菜单,在将其添加到活动之前,您可以删除或隐藏不需要的部分。覆盖OnCreateOptions菜单(菜单菜单菜单)有activity.Awesome的菜单句柄。这是动态菜单项的最佳解决方案。太棒了。这是动态菜单项的最佳解决方案。