我有一个带有菜单项的操作栏。如何隐藏/显示该菜单项?
这是我想要做的:
MenuItem item = (MenuItem) findViewById(R.id.addAction);
item.setVisible(false);
this.invalidateOptionsMenu();
我有一个带有菜单项的操作栏。如何隐藏/显示该菜单项?
这是我想要做的:
MenuItem item = (MenuItem) findViewById(R.id.addAction);
item.setVisible(false);
this.invalidateOptionsMenu();
MenuItem
,调用其setVisible
方法以调整其可见性,然后在您的活动上调用invalidateOptionsMenu()
,以便ActionBar菜单相应地进行调整。MenuItem
不是您布局中的常规视图。它是一种特殊的、完全不同的东西。代码返回null
作为item
,这会导致崩溃。您需要做的是:MenuItem item = menu.findItem(R.id.addAction);
以下是调用的顺序:
首先调用invalidateOptionsMenu()
,然后在onCreateOptionsMenu(Menu)
中获取MenuItem的引用(通过调用menu.findItem()
),并在其上调用setVisible()
invalidateOptionsMenu()
,并在重写的onCreateOptionsMenu(...)
方法中隐藏这些项目。//anywhere in your code
...
mState = HIDE_MENU; // setting state
invalidateOptionsMenu(); // now onCreateOptionsMenu(...) is called again
...
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
// inflate menu from xml
MenuInflater inflater = getSupportMenuInflater();
inflater.inflate(R.menu.settings, menu);
if (mState == HIDE_MENU)
{
for (int i = 0; i < menu.size(); i++)
menu.getItem(i).setVisible(false);
}
}
if (HIDE_MENU) { return false; } else { getSupportMenuInflater().inflate(R.menu.menu_settings, menu); return true; }
文档说明:“必须返回 true 才能显示菜单;如果返回 false,则不会显示”。 - w3bsharkonPrepareOptionsMenu()
应该用于显示/隐藏逻辑,而不是 onCreateOptionsMenu()
,因为后者仅调用一次,因此如果要在初始化后更改菜单项,则没有用处。 因此,在 onCreate
中填充,但在 onPrepare
中显示/隐藏。 - JCutting8可以。
invalidateOptionsMenu()
。 这将调用onCreateOptionsMenu()
。onCreateOptionsMenu()
中,检查标志/条件并以以下方式显示或隐藏:
MenuItem item = menu.findItem(R.id.menu_Done);
if (flag/condition)) {
item.setVisible(false);
} else { }
invalidateOptionsMenu
иҖҢдёҚжҳҜ invalidateOptions
еҗ—пјҹ - razzonCreateOptionsMenu
函数。 - suhas_sm我希望能够获得更多背景信息的答案。现在我已经弄清楚了,我将添加那个答案。
默认情况下,分享按钮将被隐藏,由android:visible="false"
设置。
main_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">
<!-- hide share button by default -->
<item
android:id="@+id/menu_action_share"
android:icon="@drawable/ic_share_white_24dp"
android:visible="false"
android:title="Share"
app:showAsAction="always"/>
<item
android:id="@+id/menu_action_settings"
android:icon="@drawable/ic_settings_white_24dp"
android:title="Setting"
app:showAsAction="ifRoom"/>
</menu>
但是共享按钮可以根据一些条件选择性地显示。
MainActivity.java
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main_menu, menu);
MenuItem shareItem = menu.findItem(R.id.menu_action_share);
// show the button when some condition is true
if (someCondition) {
shareItem.setVisible(true);
}
return true;
}
invalidateOptionsMenu()
刷新菜单。 - JCutting8您可以这样调用:
MenuItem item = menu.findItem(R.id.my_item);
item.setVisible(false);
更新:
确保你的代码不会返回 null
作为 item
,否则可能会导致应用程序崩溃。
对我来说不起作用。 我必须明确使用onPrepareOptionsMenu
将项目设置为不可见。
因此,请使用onCreateOptionsMenu
创建菜单,使用onPrepareOptionsMenu
更改可见性等。
onPrepareOptionsMenu
似乎是执行此类型操作的正确位置:“准备显示屏幕的标准选项菜单。每次显示菜单时都会调用此方法。您可以使用此方法有效地启用/禁用项目或以其他方式动态修改内容。” - yuvalinvalidateOptionsMenu()
刷新菜单。 - JCutting8在菜单布局文件中,最初将菜单项的可见性设置为false,如下所示:
<?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:visible="false"
android:id="@+id/action_do_something"
android:title="@string/txt_do_something"
app:showAsAction="always|withText"
android:icon="@drawable/ic_done"/>
</menu>
在填充菜单后,在您的onCreateOptionsMenu()中将菜单项的可见性设置为false即可。
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(menu,R.menu.menu);
MenuItem item = menu.findItem(R.id.menuItemId);
if (item != null){
item.setVisible(false);
}
}
试一下这个:
MenuItem myitem = menu.findItem(R.id.my_item);
myitem.setVisible(false);
@Override
public void onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
if (menu.findItem(R.id.action_messages) != null)
menu.findItem(R.id.action_messages).setVisible(false);
}
根据Android开发者官方网站,OnCreateOptionMenu(Menu menu) 不建议在运行时更改菜单项或图标可见性等。
系统调用onCreateOptionsMenu() 后,会保留您填充的Menu实例,并且除非因某种原因使菜单无效,否则不会再次调用onCreateOptionsMenu()。 但是,您应该仅在创建初始菜单状态时使用onCreateOptionsMenu(),而不是在活动生命周期期间进行更改。
如果要根据活动生命周期中发生的事件修改选项菜单,则可以在onPrepareOptionsMenu()方法中执行此操作。 此方法将当前的Menu对象传递给您,因此您可以修改它,例如添加,删除或禁用项目。(片段还提供了onPrepareOptionsMenu()回调。)--Android Developer官方网站--
推荐使用onOptionsItemSelected(MenuItem item)方法来跟踪用户输入。
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.edit) {
Intent intent = new Intent(this, ExampleActivity.class);
intent.putExtra(BUNDLE_KEY, mConnection);
startActivityForResult(intent, PICK_CHANGE_REQUEST);
return true;
} else if (id == R.id.delete) {
showDialog(this);
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public boolean onPrepareOptionsMenu(Menu menu){
if (Utils.checkNetworkStatus(ExampleActivity.this)) {
menu.findItem(R.id.edit).setVisible(true);
menu.findItem(R.id.delete).setVisible(true);
}else {
menu.findItem(R.id.edit).setVisible(false);
menu.findItem(R.id.delete).setVisible(false);
}
return true;
}
setVisible(false)
时,它不会消失,直到我点击三个点(菜单本身)。如果我在 onPrepareOptionsMenu
中使用 invalidateOptionsMenu()
,则项目会立即重新组织,但它们会失去其操作(如果我单击任何项目,则不会执行任何操作)。 - Aliton Oliveira
getItem
而不是findItem
,导致MenuItem
为null
。除非我们看到你的代码和崩溃日志,否则我们永远不会知道确切原因。请注意检查代码。 - K-balloonCreateOptionsMenu
中获取菜单项的引用,并在那时设置该项的可见性。或者在决定是否可见之前一直保留该引用。 - K-balloinvalidateOptionsMenu()
,然后在onCreateOptionsMenu(Menu)
内获取对MenuItem
的引用(通过调用menu.findItem()
)并在其上调用setVisible()
。 suhas_sm和P1r4nh4的答案提供了正确的方法。 - Ted HoppsetTitle()
,则菜单将再次出现。因此,我认为 https://dev59.com/UWgv5IYBdhLWcg3wTvLL#13099201 是最佳答案。 - lalthomas