如何在onOptionsItemSelected(..)中更改菜单项的可见性

3

我有三个菜单项:“启用,禁用,退出”。我的目标是,当选择R.id.menu_enable_bt时,我想使用代码将其禁用。

menu.findItem(R.id.menu_enable_bt).setVisible(false);

但我无法调用
menu.findItem(R.id.menu_enable_bt).setVisible(false);

在onOptionsItemSelected(..)方法内部,如何更改菜单项的可见性。

代码:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);
    Log.w(TAG, SubTag.msg("onCreateOptionsMenu"));

    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menu, menu);

    if (this.mBTAdapter.isEnabled()) {
        menu.findItem(R.id.menu_enable_bt).setVisible(false);
        menu.findItem(R.id.menu_disable_bt).setVisible(true);
    } else {
        menu.findItem(R.id.menu_enable_bt).setVisible(true);
        menu.findItem(R.id.menu_disable_bt).setVisible(false);
    }

    return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    super.onOptionsItemSelected(item);
    Log.w(TAG, SubTag.msg("onOptionsItemSelected"));

    switch (item.getItemId()) {
        case R.id.menu_enable_bt:
            Log.d(TAG, SubTag.bullet("onOptionsItemSelected", "menu_enable_bt"));

            //menu.findItem(R.id.menu_enable_bt).setVisible(false);  **how to do this**
            this.mATEnableBT = new ATEnableBT();
            this.mATEnableBT.execute();
            break;

        case R.id.menu_disable_bt:
            Log.d(TAG, SubTag.bullet("onOptionsItemSelected", "menu_disable_bt"));

            break;

        case R.id.menu_exit:
            Log.d(TAG,SubTag.bullet("onOptionsItemSelected", "menu_exit"));

            finish();
            break;
    }
    return super.onOptionsItemSelected(item);
}
2个回答

1
你可以使用invalidateOptionsMenu(),它将强制调用onCreateOptionsMenu重新创建。根据文档,声明选项菜单已更改,因此应该重新创建。下次显示时,将调用onCreateOptionsMenu(Menu)方法。在那里,您可以检查您的条件并采取必要的行动。

0
请查看onPrepareOptionsMenu的Javadoc。这是在菜单向用户显示之前对菜单进行更改的机会。因此,您应该维护一些描述应该可见的成员变量,并在此修改菜单项。

但我认为我仍然可以使用onCreateOptionsMenu()完成相同的工作,我必须使用一些变量来描述应该可见的内容...但我需要的是像禁用该项一样的东西,例如,一旦触摸就不能点击。 - user2121
如果您阅读我链接的方法的javadoc,它明确说明它用于您提到的原因。onCreateOptionsMenu用于创建菜单一次,然后从那时起重复使用它。创建一次后,您只需在此之后修改它。这是标准做法。 - Doug Stevenson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接