Android - 通过代码启用菜单项

4

当之前的屏幕(Activity)返回时,我需要启用一个菜单项。

我尝试了这段代码:

... ((MenuItem)findViewById(R.id.menu_how)).setEnabled(true); ...

但是会抛出空指针异常。

顺便说一下,menu_how 在 xml 中被设置为 false;而且该代码是 onActivityResult(int requestCode, int resultCode, Intent data) 调用的一部分。

4个回答

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);
}

6
尝试在onCreateOptionsMenu中使用menu.findItem(R.id.menu_how),并保存一个引用以供将来使用。
这应该可以与enabled正常工作,但是我发现在XML中将菜单项设置为不可见意味着您无法以编程方式显示/隐藏它。

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;


谢谢您的回答,但我想要做的是根据一些条件启用我的菜单项。这些条件来自另一个活动,因此我在onActivityResult(int requestCode, int resultCode, Intent data)代码中包含了((MenuItem)findViewById(R.id.menu_how)).setEnabled=true。这导致了空指针异常。 - mauricio
这就是上面的答案所完成的任务。问题是,我认为你不能直接在onActivityResult中设置它,你需要使用一个变量间接设置它。我会更新我的回答,使其更具体,并附上代码实现。 - QRohlf

0
在你的Activity中保持对菜单的引用:
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);

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