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

bro*_*oli 91 android menu android-fragments android-actionbar

我有一个活动,有2个片段.两者都是ListFragments,并且都将MenuItems贡献给菜单.我有一个MenuItem我设置了属性android:showAsAction让它显示为ActionBar上的一个按钮.哪个工作正常.

现在MenuItem依赖于状态.它是暂停/恢复菜单选项,用于暂停和恢复队列.我的问题是,当创建片段时,我无法弄清楚如何设置它的初始雕像.

它的状态取决于队列是否暂停.所以我有一个AsyncTask来获取队列并根据队列的状态设置一个布尔值(暂停).我正在调用PrepareOptionsMenu来根据队列的最后已知状态设置Pause菜单项的文本,如果我将MenuItem保留在实际菜单中,这将很有用.您点击菜单图标并触发onPrepareOptionsMenu,菜单会在显示之前更新.

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

罗布

Com*_*are 172

选项#1:试试invalidateOptionsMenu().我不知道这是否会强制立即重新绘制操作栏.

选项#2:查看是否getActionView()为受影响的人返回任何内容MenuItem.可以showAsAction简单地自动为您创建操作视图.如果是这样,你可能会启用/禁用它View.

我似乎无法找到一种方法来获取当前设置的Menu来操作它,除了onPrepareOptionMenu.

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

您可以安全地按住菜单(以及从中创建的任何项目),根据需要对其进行修改,直到下次调用onCreateOptionsMenu()为止.

  • 如果您正在使用支持库,请改用"supportInvalidateOptionsMenu()" (7认同)
  • 尝试了选项#1,这就行了.因为我试图从一个单独的线程更新回调中的UI,所以它抛出异常,因为我实际上并没有在UI线程上.为了解决这个问题,我创建了一个Handler,并在调用我的回调时向处理程序发送了一条刷新消息.但最终我使用了getActivity().invalidateOptionsMenu()来刷新菜单. (2认同)
  • @TimKist,`supportInvalidateOptionsMenu()`现已弃用; 你可以安全地使用`invalidateOptionsMenu()`. (2认同)

cV2*_*cV2 12

在我的情况下: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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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


Coo*_*ind 9

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

getActivity().invalidateOptionsMenu();
Run Code Online (Sandbox Code Playgroud)