96

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

现在 MenuItem 是状态相关的。这是一个暂停/恢复菜单选项,用于暂停和恢复队列。我的问题是我不知道在创建片段时如何设置它的初始雕像。

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

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

罗布·W。

4

7 回答 7

177

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

选项 #2:查看是否getActionView()为受影响的MenuItem. 可以showAsAction简单地为您自动创建操作视图。如果是这样,您大概可以启用/禁用View.

除了 onPrepareOptionMenu 之外,我似乎找不到一种方法来获取当前设置的菜单来操作它。

你可以挂在Menu你交上来的物品上onCreateOptionsMenu()。引用文档

您可以安全地保留菜单(以及从它创建的任何项目),根据需要对其进行修改,直到下次调用 onCreateOptionsMenu()。

于 2011-04-23T23:37:28.157 回答
14

在我的情况下: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;
}
于 2011-12-05T13:42:34.887 回答
12

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

getActivity().invalidateOptionsMenu();
于 2016-08-23T11:08:07.693 回答
4

我用过这段代码:

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

对我来说就像一个魅力,你可以在这里找到 OnPrepareOptionsMenu

于 2012-07-10T09:18:07.710 回答
2

首先请按照两行代码更新操作栏项,然后在 oncreateOptionMenu() 中设置条件。例如:

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();
    }
}
于 2014-09-08T17:48:20.760 回答
1

为清楚起见,我认为可以从以下内容中显示获取资源的直接示例,我认为这有助于通过一个快速直接示例来回答这个问题。

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 引用,然后在稍后的给定时间点更改它的状态(例如图标状态更改)。

于 2014-07-24T20:10:51.907 回答
-1

Kotlin 1.2中,只需调用:

invalidateOptionsMenu()

并且该onCreateOptionsMenu函数将被再次调用。

于 2018-10-07T11:54:25.887 回答