android:以编程方式更改选项菜单项

是否有可能以编程方式更改选项菜单项? 任何人都可以给我一个例子吗? 此外,我想禁用某些项目,以便他们不听点击,这是可能的吗?

谢谢。

对于任何需要dynamic改变菜单选项的人:

private Menu menu; // ... @Override public boolean onCreateOptionsMenu(Menu menu) { this.menu = menu; getMenuInflater().inflate(R.menu.options, menu); return true; } // ... private void hideOption(int id) { MenuItem item = menu.findItem(id); item.setVisible(false); } private void showOption(int id) { MenuItem item = menu.findItem(id); item.setVisible(true); } private void setOptionTitle(int id, String title) { MenuItem item = menu.findItem(id); item.setTitle(title); } private void setOptionIcon(int id, int iconRes) { MenuItem item = menu.findItem(id); item.setIcon(iconRes); } 

menu.xml文件

  <item android:id="@+id/item1" android:title="your Item"> </item> 

把你的Java文件

  public void onPrepareOptionsMenu(Menu menu) { menu.removeItem(R.id.item1); } 

像尼古拉说的那样在onPrepareOptionsMenu()。

对于操作栏中的菜单项,您必须使用activity.invalidateOptionsMenu();使菜单无效activity.invalidateOptionsMenu();

这在这里更详细的描述当onPrepareOptionsMenu切换菜单条目时,如何刷新ActionBar?

如果我必须更改我的选项菜单的内容,我在onMenuOpened()执行它。 这使我可以在用户访问菜单的时候检查运行状态。

 public boolean onMenuOpened(int featureid, Menu menu) { menu.clear(); if (!editable) { MenuItem itemAdd = menu.add(0, REASSIGN, Menu.NONE, context.getString(R.string.reassign)); MenuItem itemMod = menu.add(1, EDIT, Menu.NONE, context.getString(R.string.modify)); MenuItem itemDel = menu.add(2, DELETE, Menu.NONE, context.getString(R.string.delete)); itemAdd.setShortcut('0', 'a'); itemMod.setShortcut('1', 'm'); itemDel.setShortcut('2', 'd'); } else { MenuItem itemSave = menu.add(3, SAVE, Menu.NONE, context.getString(R.string.savechanges)); itemSave.setShortcut('0', 'S'); } return true; } 

禁用某些项目:

 MenuItem item = menu.findItem(R.id.ID_ASSING_TO_THE_ITEM_IN_MENU_XML); item.setEnabled(false); 

试试这个代码:

 @Override public boolean onPrepareOptionsMenu(Menu menu) { this.menu=menu; updateMenuItems(menu); return super.onPrepareOptionsMenu(menu); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.document_list_activity_actions, menu); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle presses on the action bar items if (item.getItemId() == android.R.id.home) { onHomeButtonPresssed(); }else if (item.getItemId() == R.id.action_delete) { useCheckBoxAdapter=false; deleteDocuments(); } else if (item.getItemId() == R.id.share) { useCheckBoxAdapter=false; shareDocuments(); } else if (item.getItemId() == R.id.action_tick) { useCheckBoxAdapter=true; onShowCheckboxes(); } updateMenuItems(menu); return true; } private void updateMenuItems(Menu menu){ if (useCheckBoxAdapter && menu != null) { menu.findItem(R.id.action_delete).setVisible(true); menu.findItem(R.id.share).setVisible(true); menu.findItem(R.id.action_tick).setVisible(false); } else { menu.findItem(R.id.action_delete).setVisible(false); menu.findItem(R.id.share).setVisible(false); menu.findItem(R.id.action_tick).setVisible(true); } invalidateOptionsMenu(); } 

使用下面的行我已经做了添加菜单中的值

 getActivity().invalidateOptionsMenu(); 

尝试这个工作就像一个魅力给我。

你可以像我一样做简单的事情。 当触摸菜单项时,只需将文本更改为所需的内容即可。 我需要closures和打开声音,再加上通过触摸来执行操作的function。 这是我的代码:

  @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.audioOn: audioOn = !audioOn; if (audioOn) item.setTitle("Audio Off"); else item.setTitle("Audio On"); return true; case R.id.touchOn: touchOn = !touchOn; if (touchOn) item.setTitle("Touch Off"); else item.setTitle("Touch On"); return true; default: return super.onOptionsItemSelected(item); } } 

audioOn和touchOn是在代码的其他部分检查的布尔值。 希望这可以帮助。

如果你有一个BottomBar:

 @Override public boolean onCreateOptionsMenu(Menu menu) { if (mBottomBar.getCurrentTabId() == R.id.tab_more) { getMenuInflater().inflate(R.menu.more_menu, menu); } return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.preferences: startActivity(new Intent(this, PreferenceActivity.class)); break; } return super.onOptionsItemSelected(item); } 

那么你只需要打电话:

 @Override public void onBottomBarClick(int tabId) { supportInvalidateOptionsMenu(); } 

你可以简单地通过执行如下来完成你的任务:

 private Menu menu; @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.drive_menu, menu); return true; } @Override public boolean onPrepareOptionsMenu(Menu menu) { this.menu = menu; return super.onPrepareOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.action_toggle_grid) { handleMenuOption(id); return true; } else if(id == R.id.action_toggle_list){ handleMenuOption(id); return true; } return super.onOptionsItemSelected(item); } private void handleMenuOption(int id) { MenuItem item = menu.findItem(id); if (id == R.id.action_toggle_grid){ item.setVisible(false); menu.findItem(R.id.action_toggle_list).setVisible(true); }else if (id == R.id.action_toggle_list){ item.setVisible(false); menu.findItem(R.id.action_toggle_grid).setVisible(true); } }