Android 运行时菜单项可见性更改

Android menu item visibility change in runtime

我试图在 运行 activity.

的后台执行任务时隐藏操作栏菜单项一段时间。

首先在 activity 的 onPrepareOptionsMenu 方法中,我检索 MenuItem 实例作为字段。

public void onPrepareOptionsMenu(final Menu menu) {
    super.onPrepareOptionsMenu(menu);
    // Retrieve and show the contextual settings menu item
    mContextualSettings = menu.findItem(R.id.item_menu_contextual_settings);
    mContextualSettings.setVisible(true);
}

稍后我使用该字段使其再次不可见和可见(通过使用 setVisible 方法)。

我想知道这是否是一个好方法,或者我是否应该以某种方式使用 invalidateOptionsMenu() 使其再次可见?我可以 运行 进入空指针异常吗?

谢谢。

I retrieve the MenuItem instance as a field. [...] I was wondering if this is a good approach or should I somehow use the invalidateOptionsMenu() to make it visible again?

这不是执行您正在尝试的操作的推荐方法。您最好使用 supportInvalidateOptionsMenu() 触发 onPrepareOptionsMenu() 并使用 boolean 字段或方法进行检查,然后直接设置项目的可见性。

Can I ran into null pointer exceptions?

在 Android 的最新版本中,可以在 Menu 通过 onCreateOptionsMenu() 膨胀之前调用 onPrepareOptionsMenu()。因此,您应该始终对 menu.findItem() 的结果执行空检查,或者以其他方式防止这种情况发生(也许通过检查 menu.getSize() > 0)。

        // instance variable
        public Menu option_Menu

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_container, menu);
    option_Menu = menu;
    option_Menu.findItem(R.id.skip).setVisible(false);      
    return super.onCreateOptionsMenu(menu);
    }

    // when task is completed you can show your menu just by calling this method
    public void setMenuVisible(boolean visible, int id) {
    if (option_Menu != null) {
    option_Menu.findItem(id).setVisible(visible);
    }
}

这样使用

MenuItem menuItem = menu.findItem(R.id.menu_done);      
menuItem.setVisible(true); //visible
menuItem.setVisible(false); //gone
return true;`