【问题标题】:How to hide action bar button in fragment when Navigation Drawer is open导航抽屉打开时如何在片段中隐藏操作栏按钮
【发布时间】:2015-07-20 16:50:32
【问题描述】:

我使用导航抽屉,对于其中一个片段,我有不同的菜单。对于导航抽屉打开时的那个片段,如何隐藏操作栏的按钮? 例如在图片上(http://prntscr.com/7ur712)是按钮 REFRESH。

@Override public void onCreate(Bundle savedInstanceState) {   
super.onCreate(savedInstanceState); 
**setHasOptionsMenu(true);** }

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
**inflater.inflate(R.menu.my_menu, menu);**
}

【问题讨论】:

  • 当您创建选项菜单时,您可以保留要隐藏的菜单项的变量。那么你必须将它隐藏在drawer回调中。

标签: android android-fragments navigation-drawer


【解决方案1】:

实现 ActionBarDrawerToogle 以获取导航抽屉的状态。调用invalidateOptionsMenu(); 使导航抽屉打开/关闭状态下的菜单无效。

稍后您可以根据状态显示/隐藏导航项:

@Override
public boolean onCreateOptionsMenu(Menu menu)
{
    // inflate menu from xml
    MenuInflater inflater = getSupportMenuInflater();
    inflater.inflate(R.menu.settings, menu);

    if (mState == MENU_HIDDEN)
    {
        for (int i = 0; i < menu.size(); i++)
            menu.getItem(i).setVisible(false);
    }
}

【讨论】:

    【解决方案2】:

    更新 actionBar 按钮的最佳方法是在您的 NavigationDrawer 打开/关闭时调用 invalidateOptionsMenu()

    根据 Android 培训文档页面,当您创建 ActionBarDrawerToggle 时,您应该覆盖 onDrawerClosedonDrawerOpened 方法:

    mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
                    R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close) { 
    
                /** Called when a drawer has settled in a completely closed state. */ 
                public void onDrawerClosed(View view) {
                    super.onDrawerClosed(view);
                    getActionBar().setTitle(mTitle);
                    invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
                } 
    
                /** Called when a drawer has settled in a completely open state. */ 
                public void onDrawerOpened(View drawerView) {
                    super.onDrawerOpened(drawerView);
                    getActionBar().setTitle(mDrawerTitle);
                    invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
                } 
            }; 
    

    另外,在您的onPrepareOptionsMenu 方法中,您可以检测您的抽屉是否打开,并加载与您的抽屉状态对应的菜单:

    /* Called whenever we call invalidateOptionsMenu() */ 
        @Override 
        public boolean onPrepareOptionsMenu(Menu menu) {
            // If the nav drawer is open, hide action items related to the content view 
            boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList);
            menu.findItem(R.id.action_websearch).setVisible(!drawerOpen);
            return super.onPrepareOptionsMenu(menu);
        } 
    

    有关更多信息,您可以在此处查看 Android 开发人员文档:https://developer.android.com/training/implementing-navigation/nav-drawer.html (参见章节:监听打开和关闭事件)

    【讨论】:

    • 这适用于片段。当我关闭导航抽屉时,刷新按钮消失了。但是,当我单击 Navigation Drawer 并打开另一个片段时,应用程序崩溃.. MESSAGE: FATAL EXCEPTION: main java.lang.NullPointerException at ---.onPrepareOptionsMenu(---.java:218) at android.support.v4.app .Fragment.performPrepareOptionsMenu(Fragment.java:1885) at android.support.v4.app.FragmentManagerImpl.dispatchPrepareOptionsMenu(FragmentManager.java:2032)
    • 您确定您的菜单包含您尝试访问的所有项目吗?您知道哪个对象或方法调用导致此 NPE 吗?此外,如果您使用支持库,则可以调用 supportInvalidateOptionsMenu(),而不是调用 invalidateOptionMenu() 方法
    • 我解决了。我把 if the_refresh_button != null 做代码。谢谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-17
    • 1970-01-01
    • 2020-12-29
    相关资源
    最近更新 更多