Java android:以编程方式更改选项菜单项
是否可以通过编程方式更改选项菜单项?谁能给我举个例子吗 另外,我想禁用某些项目,这样它们就不会听到单击,可以吗?menu.xmlJava android:以编程方式更改选项菜单项,java,android,option,menuitem,Java,Android,Option,Menuitem,是否可以通过编程方式更改选项菜单项?谁能给我举个例子吗 另外,我想禁用某些项目,这样它们就不会听到单击,可以吗?menu.xml <item android:id="@+id/item1" android:title="your Item"> </item> 如果我必须更改选项菜单的内容,我会在onMenuOpened()期间执行它。这允许我在用户访问菜单时检查运行状态 public boolean onMenuOpened(int featu
<item
android:id="@+id/item1"
android:title="your Item">
</item>
如果我必须更改选项菜单的内容,我会在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;
}
对于任何需要动态更改菜单选项的用户:
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);
}
就像尼古拉在OnPrepareOptions菜单()中说的那样 对于操作栏中的菜单项,必须使用
activity.invalidateOptions菜单()代码>
此处更详细地描述了这一点,以禁用某些项目:
MenuItem item = menu.findItem(R.id.ID_ASSING_TO_THE_ITEM_IN_MENU_XML);
item.setEnabled(false);
你可以像我一样做一些简单的事情。触摸菜单项时,只需将文本更改为所需内容。我需要关闭和打开声音,以及通过触摸来执行动作的能力。这是我的密码:
@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是在代码的其他部分检查的布尔值。希望这有帮助。尝试以下代码:
@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();
}
您只需执行以下步骤即可完成任务:
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);
}
}
使用我已经完成的以下几行在菜单中添加值
getActivity().invalidateOptionsMenu();
对我来说,试试这部作品吧。如果你有底线:
@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();
}
然后你只需要打电话:
@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();
}
Kotlin代码,用于以编程方式访问工具栏选项菜单项并更改文本/图标,…:
1-我们在菜单项文件中有菜单项,如:menu.xml,示例代码如下:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/balance"
android:title="0"
android:orderInCategory="100"
app:showAsAction="always" />
</menu>
3-在OnCreateOptions菜单中初始化它:
override fun onCreateOptionsMenu(menu: Menu): Boolean {
// Inflate the menu; this adds items to the action bar if it is present.
menuInflater.inflate(R.menu.main, menu)
this.menu = menu
return true
}
4-访问代码或游戏中的菜单项:
private fun initialBalanceMenuItemOnToolbar() {
var menuItemBalance = menu?.findItem(R.id.balance)
menuItemBalance?.title = Balance?.toString() ?: 0.toString()
// for change icon : menuWalletBalance?.icon
}
一个警告是,在尝试从菜单项中获取MenuItem
之前,必须确保设置了menu
。例如,如果您有类似于actionBar.setNavigationMode(actionBar.NAVIGATION\u MODE\u TABS)
,则这些选项卡会在菜单之前加载,因此在onTabSelected
中调用/showOption
会导致空指针异常。当我使用item.setVisible(false)时代码>,仅当我单击菜单本身时,该项才会隐藏。如果我使用invalidateOptions菜单()代码>项目不响应单击。如果你能在我面临的类似问题上帮助我,我将不胜感激@AlitonOliveira您应该通过检查您的标志变量状态,将item.setVisibility(false)部分放入onCreateOptions菜单方法中,并且您应该更改标志和InvalidateOptions菜单的布尔值。它将起作用。setVisible
的文档说明,您还应该调用setEnabled(false)
,否则该项仍然可以通过其快捷方式调用。如何动态执行此操作。我的意思是…在选择选项项时调用Web服务,然后在其成功响应时…重新调用CreateOptions菜单。如何做到这一点?这是我一直在寻找的,因为我想在运行时做一次决定,但不需要在之后更改选项。我使用:@Override public boolean onPrepareOptionsMenu(Menu Menu){if(!showtItemName){Menu.removietem(R.id.itemname);}return true;}当我使用invalidateeoptionsmenu()时代码>,我的始终可见项停止工作(我的意思是这些项不响应单击)。如果你能在我面临的类似问题上帮助我,我将不胜感激。当我设置item.setVisible时(false)代码>,我的项目仅在单击菜单本身时隐藏(三个点)。如果我使用invalidateOptions菜单()代码>某些项目对单击没有响应。如果你能在我面临的类似问题上帮助我,我将不胜感激。几句评论。OnMenuOpen被调用两次。第一次菜单变量为空,第二次菜单变量准备使用。我总是使用'if'子句检查菜单变量是否为null。
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.calendar, menu);
if(show_list == true) {
if(!locale.equalsIgnoreCase("sk")) menu.findItem(R.id.action_cyclesn).setVisible(false);
return true;
}