【问题标题】:Android - Enabling MenuItems by codeAndroid - 通过代码启用 MenuItems
【发布时间】:2011-03-31 16:53:18
【问题描述】:

当上一个屏幕(活动)返回时,我需要启用 MenuItem。

我试过这段代码:

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

但是启动了一个空指针异常。

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

【问题讨论】:

    标签: android menuitem


    【解决方案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;

    【讨论】:

    • 感谢您的回答,但是,我要做的是根据某些条件启用我的 MenuItem。这个条件是从另一个活动中获得的,所以我在 onActivityResult(int requestCode, int resultCode, Intent data) 代码中包含了 ((MenuItem)findViewById(R.id.menu_how)).setEnabled=true。这会导致空指针异常。
    • 这就是上面的答案所完成的。问题是,我不认为您可以直接在 onActivityResult 中设置它,您需要使用变量间接设置它。我将通过代码实现更新我的答案,使其更加具体。
    【解决方案2】:

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

    它说onCreateOptionsMenu() 方法仅在创建活动菜单时触发,并且在活动启动时发生。因此,如果您想在创建菜单/活动后更改菜单项,则需要重写 onPrepareOptionsMenu() 方法。搜索链接以获取完整详细信息。

    编辑:

    刚刚成功,一切正常。我在每个menuItem 中使用一个boolean var,它表示是否应该启用此项目。这是我的代码:

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

    【讨论】:

    • 感谢您的回答。我试试看。
    【解决方案3】:

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

    这对于enabled 应该可以正常工作,但是,我发现在 XML 中将菜单项设置为不可见意味着您无法以编程方式显示/隐藏它。

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-10
        • 2021-09-27
        • 1970-01-01
        • 2016-02-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多