跟踪 contentView 的变量,然后调用 invalidateOptionsMenu()

Variable to keep track of contentView, then call inalidateOptionsMenu()

我的主要目标是根据 Activity 中当前的布局刷新选项菜单。当 R.layout.preweb 处于活动状态时,我不希望操作栏上的按钮处于活动状态,但是当 setContentView 更改为 R.layout.main 时变为活动状态,invalidateOptionsMenu 并膨胀。这是我现在拥有的:

private int mViewMode;

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main_activity_actions, menu);
    return mViewMode == 2;
}

在我的整个活动中,在随机方法中,我有这个:

setContentView(R.layout.preweb);
mViewMode = 1;

//or somewhere else

setContentView(R.layout.main);
mViewMode = 2;
invalidateOptionsMenu();

所以基本上,只要 mViewMode 设置为 2,就会调用 invalidateOptionsMenu,然后 onCreateOptionsMenu 应该重新触发,并且 mViewMode 现在等于 2,然后我应该膨胀。但什么也没有发生——它永远不会膨胀。

这里有什么?有什么建议吗?

使用 invalidateOptionsMenu(), method onPrepareOptionsMenu(android.view.Menu) will be called, not onCreateOptionsMenu() 使菜单无效。所以需要重写这个方法,需要写代码显示菜单项或者隐藏菜单项。

例如

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    super.onPrepareOptionsMenu(menu);
    if (mViewMode == 2) {
        // Need to show menu items
        menu.findItem(R.id.menuitem1).setVisible(true);
        menu.findItem(R.id.menuitem2).setVisible(true);
    } else {
        // Need to hide menu items
        menu.findItem(R.id.menuitem1).setVisible(false);
        menu.findItem(R.id.menuitem2).setVisible(false);
    }      
    return true;
}

onCreateOptionsMenu() does not gets called when you say invalidateOptionsMenu(),因此无需从那里 return false。你总是需要returntrue从它。

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main_activity_actions, menu);
    return true; 
}