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

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

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

actionBar和Toolbar中如何动态隐藏和修改menu上的菜单_第1张图片      actionBar和Toolbar中如何动态隐藏和修改menu上的菜单_第2张图片

actionBar和Toolbar中如何动态隐藏和修改menu上的菜单_第3张图片actionBar和Toolbar中如何动态隐藏和修改menu上的菜单_第4张图片


请大家不要注意细节,我们只是看一下功能,前两个页面是 当前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:
invalidateOptionsMenu();


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

你可能感兴趣的:(Android)