>主要活动;
>导航抽屉;
>四个片段(与其相关联的布局).
我打开导航栏时遇到的问题是:虽然每个Fragment都有其特定的菜单,当我打开导航栏时,它被添加到导航栏的菜单中.我尝试了几种方法(invalidateOptionMenu(),menu.clear(),操作函数isDrawerOpen()和isDrawerClose()等),但是打开导航栏时我不能删除Fragment的菜单.
这些是我的代码的一些片段,其中大部分是由Android Studio生成的,我使用的是IDE:
主要活动:
@Override public boolean onCreateOptionsMenu(Menu menu) { if (!mNavigationDrawerFragment.isDrawerOpen()) { // Only show items in the action bar relevant to this screen // if the drawer is not showing. Otherwise,let the drawer // decide what to show in the action bar. getMenuInflater().inflate(R.menu.global,menu); restoreActionBar(); return true; } return super.onCreateOptionsMenu(menu); }
其中“全局”是具有古典“ic_action_overflow”的简单菜单.
在我的碎片我有:
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); } @Override public void onPrepareOptionsMenu(Menu menu) { super.onPrepareOptionsMenu(menu); } @Override public void onCreateOptionsMenu(Menu menu,MenuInflater inflater) { super.onCreateOptionsMenu(menu,inflater); inflater.inflate(R.menu.fragment1,menu); }
(与其他片段相同).
有人可以给我一些建议如何采取行动?
解决方法
@Override public void onPrepareOptionsMenu(Menu menu) { if (mDrawerLayout != null && isDrawerOpen()) { menu.clear(); } }
大概如何重新创建选项菜单:
>由IDE生成的NavigationDrawerFragment在打开或关闭抽屉时调用supportInvalidateOptionsMenu().
> onCreateOptionsMenu
gets called:托管活动和每个添加的片段都有机会提供菜单项.
> onPrepareOptionsMenu
gets called:再次,托管活动和每个添加的片段都有机会修改菜单.
这些片段是iterated in the order they were added.在步骤2和3中途没有办法停止通话链.
所以这个想法是让NavigationDrawerFragment在其onPrepareOptionsMenu上对菜单进行最后一刻的更改,而不会有其他碎片.
如果您需要让其他片段在onPrepareOptionsMenu中执行某些操作,则可能需要设置其他片段,以便它们可以确定抽屉是否打开,并相应地更改其行为.这可能意味着可以在主机活动中添加一个isDrawerOpen方法,或者将其中的抽屉标识符传递给该片段,就像在NavigationDrawerFragment.setup()中完成一样.