use*_*400 10 android android-fragments android-optionsmenu navigation-drawer
我正在创建Android应用程序,我试图尽可能地尊重最新的Android可用性标准.特别是,我正在使用导航抽屉准备用户界面,我正在努力确保与2.1+ Android版本的兼容性.为了理解这个问题,该项目包括:
打开导航抽屉时遇到的问题是:虽然每个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);
}
Run Code Online (Sandbox Code Playgroud)
其中"global"是一个带有经典"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);
}
Run Code Online (Sandbox Code Playgroud)
(这与其他人Fragment的情况相同).
有人可以就如何采取行动给我一些建议吗?
ent*_*nto 12
我使用Android Studio生成的样板代码遇到了同样的问题,并通过修改菜单使其工作NavigationDrawerFragment.onPrepareOptionsMenu()(在我的情况下,我想完全清除菜单):
@Override
public void onPrepareOptionsMenu(Menu menu) {
if (mDrawerLayout != null && isDrawerOpen()) {
menu.clear();
}
}
Run Code Online (Sandbox Code Playgroud)
这大致是重新创建选项菜单的方式:
NavigationDrawerFragment,由IDE生成,在supportInvalidateOptionsMenu()打开或关闭抽屉时调用.onCreateOptionsMenu被调用:托管活动和每个添加的片段都有机会贡献菜单项.onPrepareOptionsMenu被调用:再次,托管活动和每个添加的片段都有机会修改菜单.片段按添加顺序迭代.在步骤2和3中途无法阻止呼叫链.
因此,我们的想法是让NavigationDrawerFragment菜单的最后一刻更改,onPrepareOptionsMenu而不是其他片段.
如果您需要让其他片段执行某些操作onPrepareOptionsMenu,那么您可能必须设置其他片段,以便他们可以确定抽屉是否打开并相应地更改其行为.这可能意味着可能isDrawerOpen在托管活动中添加一个方法,或者将抽屉标识符传递给片段,就像它完成的那样NavigationDrawerFragment.setup().
在你的片段onCreate中,添加:
setHasOptionsMenu (true);
Run Code Online (Sandbox Code Playgroud)
然后通过onPrepareOptionsMenu隐藏.例如
@Override
public void onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
menu.findItem(R.id.action_settings).setVisible(false);
}
Run Code Online (Sandbox Code Playgroud)
在这里查看这个答案: https: //stackoverflow.com/a/18135409/2558344。它基本上使用布尔值来清除导航抽屉中的项目,反之亦然。但是,您也可以Menu menu在类中声明为私有变量并将其用作:onCreateOptionsMenu(menu, MenuInflater inflater)。
然后检查您的fragments onStop(),onPause()是否显示项目,如果是,则清除它们,例如:
if (menu != null)
menu.clear();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13633 次 |
| 最近记录: |