actionBar和Toolbar中如何动态隐藏和修改menu上的菜单

       actionBar大家都应该很熟了,非常好用的东西,如果不是很熟,可以看一下http://blog.csdn.net/guolin_blog/article/details/18234477,里面介绍的相当详细,而Toolbar是在5.0上出现的,也非常好用,而且它向下支持到2.2基本上现在的手机都可以用,说一点,知乎的页面,应该就是用它做的。

      这两种控件,都有一个Menu的功能,这里不多介绍,网上都有,这里我要说的是如何动态的修改Menu上面的菜单,这里我的应用比较简单,就是显示和隐藏其中的一个菜单,大家看一下,下面的四个图:

     


请大家不要注意细节,我们只是看一下功能,前两个页面是 当前fragment为主页面的,后两个是fragment为发现的,这里大家会发现,为“发现”的比“首页”多了一个菜单在Menu当中,这个怎么实现的呢。

我们都知道,我们在建立actionbar或是toolbar的时候,都会默认的实现两个方法,分别是onCreateOptionsMenu和onOptionsItemSelected,这两个方法,前面的是建立菜单,后面的对选中的菜单进行操作。onCreateOptionsMenu这个只在页面加载的时候,运行一次,其后就不在运行了,也就是说它只一次加载完之后,就不会再动了,所以想改变Menu在这里是不可能的,还好的android提供了一个方法叫onPrepareOptionsMenu,它的功能是在每次点击一个Menu的时候,它就改变一次,所以你想要改变Menu的值,就得在这里运行。代码如下:

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        Intent intent = new Intent();

        switch (item.getItemId())
        {
            case R.id.main_toolbar_search:
                Toast.makeText(this,"main_toolbar_search",Toast.LENGTH_LONG).show();
                break;
            case R.id.main_toolbar_notify:
                Toast.makeText(this,"main_toolbar_notify",Toast.LENGTH_LONG).show();
                break;
            case R.id.main_toolbar_about:
                intent.setClass(this, AboutActivity.class);
                break;
            case R.id.main_toolbar_register:
                Toast.makeText(this,"main_toolbar_register",Toast.LENGTH_LONG).show();
                break;
            case R.id.main_toolbar_shuffle:
                Toast.makeText(this,"main_toolbar_shuffle",Toast.LENGTH_LONG).show();
                break;
        }

        startActivity(intent);
        //切换动画一定要放在startActivity后面,并且一定要先进后出
        overridePendingTransition(R.anim.in_from_right, R.anim.out_to_left);

        return super.onOptionsItemSelected(item);
    }


    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        Log.e("isMenuShuffle",isMenuShuffle + "");
        if(isMenuShuffle)
        {
            menu.findItem(R.id.main_toolbar_shuffle).setVisible(true);
        }else
        {
            menu.findItem(R.id.main_toolbar_shuffle).setVisible(false);
        }
        return super.onPrepareOptionsMenu(menu);
    }

     这里呢,我使用的是切换fragment的方法,来变化页面的。写到这里,我们运行一下,会发现,根本没有任何变化,因为isMenuShuffle在初始的时候设置成了false可是点击事件的时候,我们修改过啊。可是却没有运行onPrepareOptionsMenu这个方法,为什么?因为这个方法,是在点击Menu上的菜单,才会变,这怎么办,android给我们提供了一个方法,

      在你点击切换fragment的事件之后。加上

     actionBar:  

this.getWindow().invalidatePanelMenu(Window.FEATURE_OPTIONS_PANEL);
   toolBar:
<pre name="code" class="java">invalidateOptionsMenu();


 OK,再次运行,就会有效果了 


  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值