如何隐藏操作栏中的菜单项?

Sti*_*tán 325 android menuitem android-menu android-actionbar

我有一个带有menuitem的操作栏.如何隐藏/显示该菜单项?

这就是我想要做的:

MenuItem item = (MenuItem) findViewById(R.id.addAction);
item.setVisible(false);
this.invalidateOptionsMenu();
Run Code Online (Sandbox Code Playgroud)

K-b*_*llo 458

获取MenuItem指向此类项目,调用setVisible它以调整其可见性,然后调用invalidateOptionsMenu()您的活动,以便相应地调整ActionBar菜单.

更新: A MenuItem不是您的布局的常规视图.它的特殊之处,完全不同.你的代码返回nullitem,并且是造成死机.你需要做的是:

MenuItem item = menu.findItem(R.id.addAction);
Run Code Online (Sandbox Code Playgroud)

这是你应该调用的顺序:首先调用invalidateOptionsMenu()然后在里面onCreateOptionsMenu(Menu)获取对MenuItem的引用(通过调用menu.findItem())并调用setVisible()

  • 我认为(充其量)这个答案的措辞很差,因为步骤的顺序是错误的.正确的顺序是首先调用`invalidateOptionsMenu()`然后在`onCreateOptionsMenu(Menu)`里面获取对`MenuItem`的引用(通过调用`menu.findItem()`)并在其上调用`setVisible()`.答案[由suhas_sm](http://stackoverflow.com/a/13099201/535871)和[由P1r4nh4](http://stackoverflow.com/a/13584471/535871)提供了正确的方法. (32认同)
  • @StirZoltán:我相信你对最后一条评论毫无意义......只需在`onCreateOptionsMenu`上获得对菜单项的引用,并在该点设置项目可见性.或者保持参考,直到你决定它是否应该可见. (6认同)
  • @StirZoltán:那就是你如何做到这一点,如果它崩溃应用程序,你可能会做错了.例如,你的`MenuItem`可能是`null`,因为你使用`getItem`而不是`findItem`.如果没有看到你的代码和崩溃日志,我们永远都不会知道. (3认同)

P1r*_*nh4 153

找到这个问题的附录:

如果您想在旅途中更改菜单项的可见性,您只需在活动中设置成员变量即可记住您要隐藏菜单并调用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);
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的例子中,我隐藏了所有项目.

  • 如果你要隐藏每件物品,那么就有一种更简单的方法.你可以这样做,而不是遍历每个项目:`if(HIDE_MENU){return false; } else {getSupportMenuInflater().inflate(R.menu.menu_settings,menu); 返回true; 文档说:"你必须返回true才能显示菜单;如果你返回false则不会显示". (3认同)
  • 这正是我一直在寻找的.保持MenuItem并调用setVisible()似乎没有按照我的预期行事(可能是因为我之后调用了invalidateOptionsMenu(),因此重建了菜单),但无论哪种方式 - 这都与我希望的完全一样,谢谢! (2认同)

suh*_*_sm 86

是.

  1. 您可以设置标志/条件.
  2. invalidateOptionsMenu()当您要隐藏选项时调用.这会打电话onCreateOptionsMenu().
  3. onCreateOptionsMenu(),检查标志/条件,并按以下方式显示或隐藏它:
MenuItem item = menu.findItem(R.id.menu_Done);

if (flag/condition)) {
  item.setVisible(false); 
} else { }
Run Code Online (Sandbox Code Playgroud)

  • 如果您将标志设置为布尔值,则可以根据需要将项目的可见性设置为标志(或!标志).所以,item.setVisbility(!flag); 使这个单线,没有条件. (3认同)
  • 不应该是`invalidateOptionsMenu`而不是`invalidateOptions`? (2认同)

eli*_*ias 37

你可以这样称呼:

MenuItem item = menu.findItem(R.id.my_item);
item.setVisible(false);
Run Code Online (Sandbox Code Playgroud)

更新:

确保您的代码没有返回null,item否则可能会导致应用程序崩溃.


Sur*_*gch 30

我正在寻找一个更多背景的答案.现在我已经弄明白了,我会补充一下这个答案.

默认情况下在菜单xml中隐藏按钮

默认情况下,共享按钮将被隐藏,如下所示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>
Run Code Online (Sandbox Code Playgroud)

在代码中显示按钮

但是可以根据某些条件选择显示共享按钮.

在此输入图像描述

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;
}
Run Code Online (Sandbox Code Playgroud)

也可以看看


hot*_*zen 23

不适合我.我必须明确地使用onPrepareOptionsMenu设置项目不可见.

因此,用于onCreateOptionsMenu创建菜单和onPrepareOptionsMenu更改可见性等.


小智 7

最初在菜单布局文件中将菜单项可见性设置为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>
Run Code Online (Sandbox Code Playgroud)

然后,您可以在充气菜单后在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);
    }
}
Run Code Online (Sandbox Code Playgroud)


Bal*_*hnu 7

这对我来说既有活动也有片段

@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);
}
Run Code Online (Sandbox Code Playgroud)


小智 7

只需一个命令即可隐藏菜单中所有项目的最佳方法是在菜单 xml 中使用“group”。只需将溢出菜单中的所有菜单项添加到同一组内即可。

在此示例中,我们有两个始终显示的菜单项(常规项和搜索)和三个溢出项:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <item
        android:id="@+id/someItemNotToHide1"
        android:title="ITEM"
        app:showAsAction="always" />

    <item
        android:id="@+id/someItemNotToHide2"
        android:icon="@android:drawable/ic_menu_search"
        app:showAsAction="collapseActionView|ifRoom"
        app:actionViewClass="android.support.v7.widget.SearchView"
        android:title="Search"/>

    <group android:id="@+id/overFlowItemsToHide">
    <item android:id="@+id/someID" 
    android:orderInCategory="1" app:showAsAction="never" />
    <item android:id="@+id/someID2" 
    android:orderInCategory="1" app:showAsAction="never" />
    <item android:id="@+id/someID3" 
    android:orderInCategory="1" app:showAsAction="never" />
    </group>
</menu>
Run Code Online (Sandbox Code Playgroud)

然后,在您的 Activity 上(最好在 onCreateOptionsMenu 上),使用命令 setGroupVisible 将所有菜单项可见性设置为 false 或 true。

public boolean onCreateOptionsMenu(Menu menu) {
   menu.setGroupVisible(R.id.overFlowItems, false); // Or true to be visible
}
Run Code Online (Sandbox Code Playgroud)

如果您想在 Activity 的其他任何地方使用此命令,请务必将菜单类保存到本地,并始终检查菜单是否为空,因为您可以在 createOptionsMenu 之前执行:

Menu menu;

public boolean onCreateOptionsMenu(Menu menu) {
       this.menu = menu;

}

public void hideMenus() {
       if (menu != null) menu.setGroupVisible(R.id.overFlowItems, false); // Or true to be visible       
}
Run Code Online (Sandbox Code Playgroud)


小智 6

P1r4nh4答案工作正常,我只是使用布尔标志简化它:

public int mState = 0; //at the top of the code
//where you want to trigger the hide action
mState = 1; // to hide or mState = 0; to show
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 == 1) //1 is true, 0 is false
    {
        //hide only option 2
            menu.getItem(2).setVisible(false);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 使用"0"和"1"不是"布尔标志",它是伪布尔值.此外,没有理由在这里使用实际的布尔值. (2认同)
  • 此外,你可以有几个状态,不只是一个隐藏,一个显示.根据应用程序的复杂程度以及拒绝为新应用程序状态编写新活动,您可能具有SHOW_ALL状态,HIDE_ALL状态,还有HIDE_EDIT或HIDE_SHARE状态,以防您想要隐藏菜单的某些部分. (2认同)

Cha*_*ndo 6

根据 Android 开发者官方网站,不建议使用 OnCreateOptionMenu(Menu menu) 在运行时更改菜单项或图标、可见性等。

在系统调用 onCreateOptionsMenu() 之后,它会保留您填充的 ​​Menu 的一个实例并且不会再次调用 onCreateOptionsMenu() 除非菜单因某种原因失效。但是,您应该仅使用 onCreateOptionsMenu() 来创建初始菜单状态,而不要在活动生命周期中进行更改。

如果要根据活动生命周期期间发生的事件修改选项菜单,可以在 onPrepareOptionsMenu() 方法中进行。此方法向您传递当前存在的 Menu 对象,以便您可以对其进行修改,例如添加、删除或禁用项目。(Fragments 还提供了 onPrepareOptionsMenu() 回调。)-- AndroidDeveloper 官方网站--

推荐您可以使用此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);
}
Run Code Online (Sandbox Code Playgroud)

如果您需要在运行时更改菜单项,您可以使用onPrepareOptionsMenu(Menu menu)来更改它们

@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;
} 
Run Code Online (Sandbox Code Playgroud)


Aje*_*dav 5

您可以使用toolbar.getMenu().clear();一次隐藏所有菜单项


小智 5

尝试这个:

MenuItem myitem = menu.findItem(R.id.my_item);
myitem.setVisible(false);
Run Code Online (Sandbox Code Playgroud)