как обновить пункт меню, показанный в панели действий?

<p>у меня есть активность, которая имеет 2 фрагмента. оба являются listfragments и оба вносят элементы menuitem в меню. у меня есть один menuitem, который я установил атрибут android: showasaction, чтобы он отображался в виде кнопки на панели действий. который работает отлично.</p><p>теперь menuitem зависит от состояния. это пункт меню пауза/возобновление для приостановки и возобновления очереди. моя проблема в том, что я не могу понять, как установить первоначальную статую при создании фрагмента.</p><p>это состояние зависит от того, приостановлена очередь или нет. итак, у меня есть asynctask, которая получает очередь и устанавливает логическое значение (приостановлено) в зависимости от состояния очереди. я вызываю onprepareoptionsmenu, чтобы установить текст для пункта меню "пауза" на основе последнего известного состояния очереди, и это прекрасно работает, если я оставлю menuitem в реальном меню. вы нажимаете значок меню, и onprepareoptionsmenu запускается, и меню обновляется перед его отображением.</p><p>проблема в том, что если я помещу тот же самый menuitem в actionbar (showasaction), как я могу принудительно обновить его, не вызывая onprepareoptionsmenu? я должен быть в состоянии сделать это, потому что при первом запуске приложения я отправляю запрос на получение очереди, но задача возвращается после настройки и отображения actionbar. я создал обработчик в своем фрагменте, который вызывается каждый раз, когда я получаю обновление очереди, но оттуда, как я могу обновить текст для моего menuitem в actionbar? кажется, я не могу найти способ заставить текущее установленное меню манипулировать им, кроме как в onprepareoptionmenu.</p><p>роб у.</p>

<p>вариант № 1: попробуйте <a href="http://developer.android.com/reference/android/app/activity.html#invalidateoptionsmenu%28%29"><code>invalidateoptionsmenu()</code></a> . я не знаю, приведет ли это к немедленной перерисовке панели действий или нет.</p><p>вариант № 2: посмотрите, возвращает ли <code>getactionview()</code> что-либо для затронутого <code>menuitem</code>. вполне возможно, что <code>showasaction</code> просто автоматически создает представления действий для вас. если это так, вы можете предположительно включить/отключить это <code>view</code>.</p><blockquote> <p>кажется, я не могу найти способ заставить текущее установленное меню манипулировать им, кроме как в onprepareoptionmenu.</p> </blockquote><p>вы можете висеть на объекте <code>menu</code>, который вы передали в <code>oncreateoptionsmenu()</code>. цитировать <a href="http://developer.android.com/reference/android/app/activity.html#oncreateoptionsmenu%28android.view.menu%29">документы</a> :</p><blockquote> <p>вы можете безопасно удерживать меню (и любые элементы, созданные из него), внося изменения в него по своему желанию, до следующего вызова oncreateoptionsmenu ().</p> </blockquote>

<p>в моем случае: <code>invalidateoptionsmenu</code> просто переустанавливал текст на исходный, но прямой доступ к пункту меню и переписывание желаемого текста работал без проблем:</p><pre><code>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(); } } </code></pre><p>благодаря комментарию ниже, я смог получить доступ к пункту меню с помощью следующего кода:</p><pre><code>@override public boolean oncreateoptionsmenu(menu menu) { menuinflater inflater = getmenuinflater(); inflater.inflate(r.menu.magazine\_swipe\_activity, menu); mnutopmenuactionbar\_ = menu; return true; } </code></pre>

<p>чтобы обновить меню из фрагмента, просто позвоните:</p><pre><code>getactivity().invalidateoptionsmenu(); </code></pre>

<p>я использовал этот код:</p><pre><code>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; } </code></pre><p>и работал как шарм для меня, вы можете найти onprepareoptionsmenu <a href="http://developer.android.com/reference/android/app/activity.html#onprepareoptionsmenu%28android.view.menu%29">здесь</a> </p>

<p>сначала, пожалуйста, следуйте двум строкам кода, чтобы обновить элементы панели действий, прежде чем вам нужно установить условие в oncreateoptionmenu (). например:</p><pre><code>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(); } } </code></pre>

<p>для ясности я подумал, что прямой пример захвата ресурса можно показать из следующего, что, я думаю, способствует ответу на этот вопрос с помощью быстрого прямого примера.</p><pre><code>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; } </code></pre><p>в этом случае вы держите ссылку menuitem в начале, а затем изменяете ее состояние (например, для изменения состояния значка) в более поздний данный момент времени.</p>