Как обновить пункт меню, показанный в панели действий? - PullRequest
91 голосов
/ 24 апреля 2011

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

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

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

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

Rob W.

Ответы [ 7 ]

170 голосов
/ 24 апреля 2011

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

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

Кажется, я не могу найти способ заставить текущее установленное Меню манипулировать им, кроме как в onPrepareOptionMenu.

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

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

12 голосов
/ 05 декабря 2011

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

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

getActivity().invalidateOptionsMenu();
3 голосов
/ 10 июля 2012

Я использовал этот код:

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

2 голосов
/ 08 сентября 2014

Сначала выполните две строки кодов, чтобы обновить элементы панели действий. перед этим вы должны установить условие в 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();
    }
}
1 голос
/ 25 июля 2014

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

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

0 голосов
/ 07 октября 2018

In Kotlin 1.2 просто позвоните:

invalidateOptionsMenu()

и функция onCreateOptionsMenu будет вызвана снова.

...