最近做一个项目,要求在一个activity中加载多个Fragment,用底部导航栏来相互切换,在切换过程中对
Menu菜单的显示与隐藏.
先来分析一下:
android4.0之后引入了fragment的概念,它的生命周期函数和activity几乎一样。对菜单的操作也是通过
onCreateOptionMenu()实现的。
fragment可以通过实现 onCreateOptionMenu() 提供菜单项给activity的选项菜单。为了使这个方法接收
调
用,无论如何, 你必须在 onCreate() 期间调用 setHasOptionsMenu() 来指出fragment愿意添加item到选项菜
单(否则, fragment将接收不到对 onCreateOptionsMenu()的调用)
随后从fragment添加到Option菜单的任何项,都会被 追加到现有菜单项的后面.当一个菜单项被选择, fragment
也会接收到 对 onOptionsItemSelected() 的回调.也可以在你的fragment layout中通过调用 registerForContextMenu()
注册一个view来提供一个环境菜单.当用户打开环境菜单, fragment接收到一个对 onCreateContextMenu() 的调用.
当用户选择一个项目, fragment接收到一个对onContextItemSelected() 的调用.
注意: 尽管你的fragment会接收到它所添加的每一个菜单项被选择后的回调, 但实际上当用户选择一个菜单项时,
activity会首先接收到对应的回调.如果activity的on-item-selected回调函数实现并没有处理被选中的项目, 然后事件
才会被传递到fragment的回调.
下面来看看代码 ,目的是我需要在fragment1中显示menu , 在fragment2中隐藏menu
1.要在fragment1 的onCreate() 期间调用 setHasOptionsMenu() 来指出fragment愿意添加item到选项菜单
@Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); }
@Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater);
menu.add(0, 1, 0, "新建").setIcon(R.mipmap.icon_menu_add) .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
//对整个菜单进行显示
menu.setGroupVisible(R.menu.menu_main, true);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case 1: //完成菜单点击的操作
break; } return super.onOptionsItemSelected(item);}
2. 要在fragment2中隐藏menu
@Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); menu.setGroupVisible(R.menu.menu_main,false); }
以上是在Fragment中对菜单的显示与隐藏,而
在Activity中更简单 , 看代码
// 1. 定义mMenu成员变量 private Menu mMenu; // 2. 在onCreateOptionsMenu()里初始化mMenu,并隐藏Menu item @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_main, menu); mMenu = menu; mMenu.findItem(R.id.menu_tem).setVisible(false); return true;} //使用findItem()通过item ID找到Item。使用getVisible(false)来隐藏Menu Item。 //在onCreateOptionsMenu()中调用setVisible(false),会使Menu Item默认隐藏。 // 3. 在想显示menu item的时候,调用setVisible(true)即可。 mMenu.findItem(R.id.menu_tem).setVisible(true);