Как обновить пункт меню, показанный в ActionBar?

У меня есть Activity, у которого есть 2 фрагмента. Оба являются ListFragments и оба способствуют MenuItems в меню. У меня есть один MenuItem, что я установил атрибут android: showAsAction, чтобы он отображался как кнопка на ActionBar. Что отлично работает.

Теперь MenuItem зависит от состояния. Это параметр паузы/возобновления для приостановки и возобновления очереди. Моя проблема заключается в том, что я не могу понять, как установить исходную статую при создании Фрагмента.

Состояние зависит от того, приостановлена ​​ли очередь или нет. Поэтому у меня есть AsyncTask, которая получает очередь и устанавливает логическое (приостановленное) на основе состояния очереди. Я вызываю onPrepareOptionsMenu, чтобы установить текст для пункта меню "Пауза" на основе последнего известного состояния очереди, и это отлично работает, если я покину MenuItem в фактическом меню. Вы нажимаете значок меню, а onPrepareOptionsMenu запускается, и меню обновляется до его отображения.

Проблема в том, что если я поместил тот же MenuItem в ActionBar (showAsAction), как я могу заставить его обновляться без необходимости вызова onPrepareOptionsMenu? Мне нужно это сделать, потому что при первом запуске приложения я отправляю запрос на получение очереди, но задача возвращается после установки и отображения ActionBar. Я создал обработчик в своем фрагменте, который вызывается каждый раз, когда я получаю обновление очереди, но оттуда, как я могу обновить текст для своего MenuItem в ActionBar? Я не могу найти способ получить текущее заданное меню, чтобы манипулировать им, кроме как в onPrepareOptionMenu.

Rob W.

Ответ 1

Вариант №1: Попробуйте invalidateOptionsMenu(). Я не знаю, приведет ли это к немедленной перерисовке панели действий или нет.

Вариант №2: Посмотрите, возвращает ли getActionView() что-либо для затронутого MenuItem. Возможно, что showAsAction просто автоматически создает для вас виды действий. Если это так, вы можете предположительно включить/отключить это View.

Я не могу найти способ получить текущее настроенное меню, чтобы манипулировать им, кроме как в onPrepareOptionMenu.

Вы можете висеть на Menu объект, которому вы были переданы onCreateOptionsMenu(). Цитирование docs:

Вы можете безопасно удерживать меню (и любые элементы, созданные из него), внося необходимые изменения в него, до тех пор, пока не будет вызываться onCreateOptionsMenu().

Ответ 2

в моем случае: 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;
}

Ответ 3

Чтобы обновить меню из фрагмента, просто вызовите:

getActivity().invalidateOptionsMenu();

Ответ 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 здесь

Ответ 5

Для ясности я подумал, что прямой пример захвата ресурса можно показать из следующего, что, я думаю, вносит свой вклад в ответ на этот вопрос с помощью быстрого прямого примера.

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 в начале и затем изменяете ее состояние (например, для изменений состояния значка) в следующий заданный момент времени.

Ответ 6

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