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

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

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

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

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

Роб У.

Solutions Collecting From Web of "Как обновить пункт меню, показанный в ActionBar?"

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

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

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

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

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

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

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

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

И работала как прелесть для меня, вы можете найти OnPrepareOptionsMenu здесь

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

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