如何更新ActionBar中显示的菜单项?

我有一个有2个片段的活动。 两者都是ListFragments,并且都向菜单贡献MenuItems。 我有一个MenuItem,我已经设置属性android:showAsAction让它显示为一个button上的ActionBar。 哪个工作正常。

现在MenuItem是状态相关的。 这是暂停/恢复菜单选项,用于暂停和恢复队列。 我的问题是我无法弄清楚如何设置它的初始雕像创build碎片时。

它的状态取决于队列是否暂停。 所以我有一个AsyncTask获取队列,并根据队列的状态设置布尔(暂停)。 我打电话onPrepareOptionsMenu基于队列的最后一个已知的状态设置暂停菜单项的文本,如果我在实际的菜单中离开MenuItem这很好。 点击菜单图标,onPrepareOptionsMenu被触发,菜单在显示之前被更新。

问题是,如果我把相同的MenuItem的ActionBar(showAsAction),我怎么能强制更新,而无需调用onPrepareOptionsMenu? 我需要能够做到这一点,因为在第一次启动的应用程序,我发送一个请求来获取队列,但任务返回后,设置和显示ActionBar。 我在我的片段中创build了一个处理程序,每次获取队列更新时都会调用该处理程序,但是从那里,如何更新ActionBar上的MenuItem的文本? 我似乎无法find一种方法来获取当前设置的菜单来操纵它,除了在onPrepareOptionMenu。

罗布·W

选项1:尝试invalidateOptionsMenu() 。 我不知道这是否会强制立即重绘动作栏。

选项2:查看getActionView()是否为受影响的MenuItem返回任何内容。 showAsAction可能会自动为您创build动作视图。 如果是这样,你可以推测启用/禁用该View

我似乎无法find一种方法来获得当前设置的菜单来操纵它,除了在onPrepareOptionMenu。

你可以挂在你交给的onCreateOptionsMenu()Menu对象上。 引用文档 :

您可以放心地按住菜单(以及从中创build的任何项目),根据需要对其进行修改,直到下一次调用onCreateOptionsMenu()。

在我的情况下: invalidateOptionsMenu只是将文本重新设置为原始文本,但直接访问菜单项,并重新编写的工作没有问题的愿望:

 if (mnuTopMenuActionBar_ != null) { MenuItem mnuPageIndex = mnuTopMenuActionBar_ .findItem(R.id.menu_magazin_pageOfPage_text); if (mnuPageIndex != null) { if (getScreenOrientation() == 1) { mnuPageIndex.setTitle((i + 1) + " von " + pages); } else { mnuPageIndex.setTitle( (i + 1) + " + " + (i + 2) + " " + " von " + pages); } // invalidateOptionsMenu(); } } 

由于下面的评论,我可以通过以下代码访问菜单项:

 @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.magazine_swipe_activity, menu); mnuTopMenuActionBar_ = menu; return true; } 

要从Fragment中刷新菜单,只需调用:

 getActivity().invalidateOptionsMenu(); 

我已经使用这个代码:

 public boolean onPrepareOptionsMenu (Menu menu) { MenuInflater inflater = getMenuInflater(); TextView title = (TextView) findViewById(R.id.title); menu.getItem(0).setTitle( getString(R.string.payFor) + " " + title.getText().toString()); menu.getItem(1).setTitle(getString(R.string.payFor) + "..."); return true; } 

和我一样的魅力,你可以在这里findOnPrepareOptionsMenu

为了清楚起见,我认为抓住资源的直接例子可以从下面看出来,我认为这是一个快速直接的例子,有助于回答这个问题。

 private MenuItem menuItem_; @Override public boolean onCreateOptionsMenu(Menu menuF) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu_layout, menuF); menuItem_ = menuF.findItem(R.id.menu_item_identifier); return true; } 

在这种情况下,您可以在开头保留一个MenuItem引用,然后在稍后给定的时间点更改其状态(例如,图标状态更改)。

 First please follow the two lines of codes to update the action bar items before that you should set a condition in oncreateOptionMenu(). For example: Boolean mISQuizItemSelected =false; /** * Called to inflate the action bar menus *. * * @param menu the menu * @return true, if successful */ @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu items for use in the action bar inflater.inflate(R.menu.menu_demo, menu); //condition to hide the menus if(mISQuizItemSelected) { for (int i = 0; i < menu.size(); i++) menu.getItem(i).setVisible(false); } return super.onCreateOptionsMenu(menu); } /** * Called when the item on the action bar being selected. * * @param item menuitem being selected * @return true if the menuitem id being selected is matched * false if none of the menuitems id are matched */ @Override public boolean onOptionsItemSelected(MenuItem item) { if(item.getId()==R.id.action_quiz) { //to navigate based on the usertype either learner or leo mISQuizItemSelected=true; ActionBar actionBar = getActionBar(); invalidateOptionMenu(); } }