我试图从onOptionsItemSelected(MenuItem项目)方法之外更改菜单项的标题。

我已经做了以下工作;

public boolean onOptionsItemSelected(MenuItem item) {
  try {
    switch(item.getItemId()) {
      case R.id.bedSwitch:
        if(item.getTitle().equals("Set to 'In bed'")) {
          item.setTitle("Set to 'Out of bed'");
          inBed = false;
        } else {
          item.setTitle("Set to 'In bed'");
          inBed = true;
        }
        break;
    }
  } catch(Exception e) {
    Log.i("Sleep Recorder", e.toString());
  }
  return true;
}

但是,我希望能够修改这个方法之外的特定菜单项的标题。


当前回答

在我看来,你想要在一个本地方法内更改菜单的内容,这个方法随时被调用,无论何时发生事件,或在活动UI线程。

你为什么不采取菜单的实例在onprepareoptionmenu的全局变量时,这是覆盖和使用你的方法。确保在事件发生时(如按钮单击),或在活动UI线程,处理程序或异步任务后执行时调用此方法。

您应该事先知道要更改的菜单项的索引。清除菜单后,您需要扩展菜单XML并更新项目的名称或图标。

其他回答

创建一个setOptionsTitle()方法并在类中设置一个字段。如:

String bedStatus = "Set to 'Out of Bed'";

...

public void setOptionsTitle(String status)
{
    bedStatus = status;

}

现在,当菜单被填充时,将标题更改为您的状态:

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);

        menu.add(bedStatus);


        // Return true so that the menu gets displayed.
        return true;
    }

在我看来,你想要在一个本地方法内更改菜单的内容,这个方法随时被调用,无论何时发生事件,或在活动UI线程。

你为什么不采取菜单的实例在onprepareoptionmenu的全局变量时,这是覆盖和使用你的方法。确保在事件发生时(如按钮单击),或在活动UI线程,处理程序或异步任务后执行时调用此方法。

您应该事先知道要更改的菜单项的索引。清除菜单后,您需要扩展菜单XML并更新项目的名称或图标。

我需要更改片段的菜单图标。我把查尔斯对这个问题的回答做了一点修改,以获取片段:

    private Menu top_menu;

    //...
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

       setHasOptionsMenu(true);
       //...
       rootview = inflater.inflate(R.layout.first_content,null);
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.fragment_menu, menu);
        this.top_menu = menu;
    }


    // my procedure
    private void updateIconMenu() {
         if(top_menu!= null) {
             MenuItem nav_undo = top_menu.findItem(R.id.action_undo);
             nav_undo.setIcon( R.drawable.back);
         }
    }

你可以这样做,不需要专门的变量:

Toolbar toolbar = findViewById(R.id.toolbar);
Menu menu = toolbar.getMenu();
MenuItem menuItem = menu.findItem(R.id.some_action);
menuItem.setTitle("New title");

或者简单点说:

MenuItem menuItem = ((Toolbar)findViewById(R.id.toolbar)).getMenu().findItem(R.id.some_action);
menuItem.setTitle("New title");

它只在菜单创建后工作。

声明你的菜单字段。

private Menu menu;

下面是onCreateOptionsMenu()方法

public boolean onCreateOptionsMenu(Menu menu) {
this.menu = menu;
    try {
        getMenuInflater().inflate(R.menu.menu_main,menu);
    } catch (Exception e) {
        e.printStackTrace();
        Log.i(TAG, "onCreateOptionsMenu: error: "+e.getMessage());
    }
    return super.onCreateOptionsMenu(menu);
}

下面将是您的名称setter活动。要么通过单击按钮,要么通过条件代码

public void setMenuName(){
menu.findItem(R.id.menuItemId).setTitle(/*Set your desired menu title here*/);
}

这对我很管用。