您的位置:首页 > 移动开发 > Android开发

Android 在Fragment或activity中显示与隐藏Menu的菜单

2017-12-26 10:12 501 查看
最近做一个项目,要求在一个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

4000
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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: