Как обновить пункт меню, отображаемый на панели действий?
У меня есть деятельность, которая имеет 2 фрагментов. Оба являются ListFragments и оба вносят MenuItems в меню. У меня есть один MenuItem, который я установил атрибут android:showAsAction, чтобы он отображался как кнопка на панели действий. Что прекрасно работает.
теперь меню зависит от состояния. Это пункт меню пауза / возобновление для приостановки и возобновления очереди. Моя проблема в том, что я не могу понять, как установить его начальную статую, когда фрагмент создается.
Это государство зависит от того, приостановлена ли очередь или нет. Поэтому у меня есть AsyncTask, который получает очередь и устанавливает логическое значение (приостановлено) на основе состояния очереди. Я вызываю onPrepareOptionsMenu, чтобы установить текст для пункта меню паузы на основе последнего известного состояния очереди, и это отлично работает, если я оставляю меню в фактическом меню. Вы нажимаете на значок меню и onPrepareOptionsMenu запускается и меню обновляется перед его отображением.
проблема в том, что если я поставлю это тот же MenuItem на панели действий (showAsAction), как я могу заставить его обновить без необходимости вызова onPrepareOptionsMenu? Мне нужно иметь возможность сделать это, потому что при первом запуске приложения я отправляю запрос на получение очереди, но задача возвращается после настройки и отображения панели действий. Я создал обработчик в своем фрагменте, который вызывается каждый раз, когда я получаю обновление очереди, но оттуда, как я могу обновить текст для моего меню на панели действий? Кажется, я не могу найти способ получить в настоящее время установить меню для управления им, за исключением в onPrepareOptionMenu.
Роб У.
6 ответов:
Вариант №1: Попробуйте
invalidateOptionsMenu(). Я не знаю, заставит ли это немедленно перерисовать панель действий или нет.Вариант № 2: Смотрите, если
getActionView()возвращает что-либо для пострадавшихMenuItem. Вполне возможно, чтоshowAsActionпросто автоматически создает виды действия для вас. Если это так, вы можете предположительно включить / отключить этоView.кажется, я не могу найти способ заставить текущее установленное меню манипулировать им, за исключением in onPrepareOptionMenu.
вы можете повесить на
Menuобъект вам вручилиonCreateOptionsMenu(). Цитируя docs:вы можете безопасно удерживать меню (и любые элементы, созданные из него), внося в него изменения по желанию, до следующего вызова onCreateOptionsMenu ().
в моем случае:
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; }
я использовал этот код:
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 в начале, а затем изменяете ее состояние (например, для изменения состояния значка) в более поздний момент времени.
сначала следуйте двум строкам кодов, чтобы обновить элементы панели действий перед этим вы должны установить условие в 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(); } }
Comments