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