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

来源:互联网 发布:300271 华宇软件 编辑:程序博客网 时间:2024/05/16 08:39

       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,再次运行,就会有效果了

1 7
原创粉丝点击