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

最近做一个项目,要求在一个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);





评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值