android 获取菜单项,android - 如何更新ActionBar中显示的菜单项?

android - 如何更新ActionBar中显示的菜单项?

我有一个活动,有2个片段。 两者都是ListFragments,并且都将MenuItems贡献给菜单。 我有一个MenuItem,我已经设置了属性android:showAsAction,让它显示为ActionBar上的一个按钮。 哪个工作正常。

现在MenuItem依赖于状态。 它是暂停/恢复菜单选项,用于暂停和恢复队列。 我的问题是,在创建片段时,我无法弄清楚如何设置它的初始雕像。

它的状态取决于队列是否暂停。 所以我有一个AsyncTask来获取队列并根据队列的状态设置一个布尔值(暂停)。 我调用onParepareOptionsMenu根据队列的最后已知状态设置Pause菜单项的文本,如果我将MenuItem保留在实际菜单中,这将很有用。 点击菜单图标并触发onPrepareOptionsMenu,菜单会在显示之前更新。

问题是,如果我在ActionBar(showAsAction)上放置相同的MenuItem,如何强制它更新而不必调用onPrepareOptionsMenu? 我需要能够这样做,因为在第一次启动应用程序时,我发送了一个获取队列的请求,但是在设置并显示ActionBar后,任务返回。 我在我的片段中创建了一个处理程序,每次获得队列更新时都会调用该处理程序,但是从那里,我如何在ActionBar上更新我的MenuItem的文本? 我似乎无法找到一种方法来获取当前设置的菜单来操作它,除了onPrepareOptionMenu。

罗布

7个解决方案

169 votes

选项#1:尝试Menu.我不知道这是否会强制立即重新绘制操作栏。

选项#2:查看Menu是否为受影响的onCreateOptionsMenu()返回任何内容.showAsAction可能只是为您自动创建操作视图。 如果是这样,你可以推测/禁用View。

我似乎无法找到一种方法来获取当前设置的菜单来操作它,除了onPrepareOptionMenu。

您可以挂在Menu的Menu对象上。引用文档:

您可以安全地按住菜单(以及从中创建的任何项目),根据需要对其进行修改,直到下次调用onCreateOptionsMenu()为止。

CommonsWare answered 2019-08-28T01:17:53Z

12 votes

在我的情况下: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;

}

cV2 answered 2019-08-28T01:18:25Z

7 votes

要从Fragment刷新菜单,只需调用:

getActivity().invalidateOptionsMenu();

CoolMind answered 2019-08-28T01:18:51Z

3 votes

我用过这段代码:

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

ASK answered 2019-08-28T01:19:23Z

1 votes

为了清楚起见,我认为可以从下面显示抓取资源的直接示例,我认为通过快速直接示例有助于对此问题的响应。

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引用,然后在稍后的给定时间点更改它的状态(例如,对于图标状态更改)。

Jay Snayder answered 2019-08-28T01:19:56Z

1 votes

首先,请按照两行代码更新操作栏项在此之前,您应该在oncreateOptionsMenu()中设置一个条件。例如:

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

}

}

saranya answered 2019-08-28T01:20:22Z

-1 votes

在Kotlin 1.2中,只需致电:

invalidateOptionsMenu()

并将再次调用onCreateOptionsMenu函数。

j_gonfer answered 2019-08-28T01:20:55Z

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值