Android - 通过代码启用MenuItems

时间:2010-08-18 17:36:50

标签: android menuitem

我需要在前一个屏幕(Activity)返回时启用MenuItem。

我试过这段代码:

... ((菜单项)findViewById(R.id.menu_how))的setEnabled(真)。 ...

但是启动了空指针异常。

BTW,在xml中menu_how设置为false;并且代码是onActivityResult(int requestCode,int resultCode,Intent data)调用的一部分。

4 个答案:

答案 0 :(得分:6)

我在android dev site找到了一些可能有帮助的东西(查找“在运行时更改菜单项”部分)

它表示onCreateOptionsMenu()方法仅在创建活动菜单时触发,并且在此活动开始时发生。因此,如果要在创建菜单/活动后更改菜单项,则需要覆盖onPrepareOptionsMenu()方法。搜索链接以获取完整的详细信息。

编辑:

刚刚制作它并且工作正常。我每boolean var使用一个menuItem,表示是否应启用此项。这是我的代码:

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

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle item selection
    switch (item.getItemId()) 
    {
        case R.id.gm_new_game:
            //newGame();
            return true;
        case R.id.gm_stand_up:
            //some code when "gm_stand_up" button clicked..
            return true;
        case R.id.gm_forfeit:
            //some code when "gm_forfeit" button clicked..
            return true;
        case R.id.gm_surrender:
            //some code when "gm_surrender" button clicked..
            return true;
        case R.id.gm_exit_table:
            exitTableCommand();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

@Override
public boolean onPrepareOptionsMenu(Menu menu)
{
    menu.findItem(R.id.gm_forfeit).setEnabled(forfeitMenuButtonIsEnabled);
    menu.findItem(R.id.gm_surrender).setEnabled(surrenderMenuButtonIsEnabled);
    menu.findItem(R.id.gm_new_game).setEnabled(newGameMenuButtonIsEnabled);
    menu.findItem(R.id.gm_stand_up).setEnabled(standUpMenuButtonIsEnabled);

    return super.onPrepareOptionsMenu(menu);
}

答案 1 :(得分:6)

尝试在onCreateOptionsMenu中使用menu.findItem(R.id.menu_how)并保存引用以供日后使用。

这应该可以与enabled一起使用,但是,我发现在XML中将菜单项设置为不可见意味着您无法以编程方式显示/隐藏它。

答案 2 :(得分:1)

你在哪里调用它?(对不起,没仔细阅读)我认为你需要在菜单膨胀后调用它(通常在OnCreateOptionsMenu中)。为此,您可以在另一个Activity返回时将变量设置为true,然后在调用inflater.inflate之后在OnCreateOptionsMenu中执行((MenuItem)findViewById(R.id.menu_how)).setEnabled(mMyBooleanField)

编辑:要在代码中完成此操作,它可能看起来像这样:

在班级的顶层(以及所有其他班级成员):
Boolean mEnableMenuItem = false;

在OnCreateOptionsMenu中:
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.options_main, menu); ((MenuItem)findViewById(R.id.menu_how)).setEnabled(mEnableMenuItem );

在OnActivityResult中:
mEnableMenuItem = true;

答案 3 :(得分:0)

在您的活动中保留对菜单的引用:

private Menu mMenu;

然后:

public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_note, menu);
        mMenu = menu;
        return true;
    }

现在,要访问活动中任何位置的菜单项,请使用与此相似的代码:

mMenu.findItem(R.id.menu_how).setVisible(false);

mMenu.findItem(R.id.menu_how).setEnabled(true);