需求
当 Toolbar
布局放在底层的 Activity
中, 而Toolbar
上的菜单需要根据切换的 Fragment
进行切换时。
分析
Fragment
和Activity
一样,可以重写onCreateOptionsMenu
方法来设定自己的菜单,其实这两个地方使用onCreateOptionsMenu
的目的和效果都是完全一样的,但是由于Fragment
是从属于Activity
的,因此使用onCreateOptionsMenu
的时候需要注意以下几点。
-
Activity
和Fragment
中onCreateOptionsMenu
方法的差别:
/*
Activity的onCreateOptionsMenu方法
*/
@Override
public boolean onCreateOptionsMenu(Menu menu) {
return super.onCreateOptionsMenu(menu);
}
/*
Fragment的onCreateOptionsMenu方法
*/
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
}
两者的差别在于
1.一个有返回值,一个没有
2.Fragment的onCreateOptionsMenu的方法多了一个MenuInflater参数
- 想让
Fragment中
的onCreateOptionsMenu
方法生效必须先调用setHasOptionsMenu
方法
官方文档说明如下:
Initialize the contents of the Activity's standard options menu. You should place your menu items in to menu
. For this method to be called, you must have first called setHasOptionsMenu(boolean).
- 如果Fragment和Activity都同时inflate了一个menu资源文件,那么menu资源所包含的菜单会出现两次
这是因为inflater.inflate(int menuRes, Menu menu)
方法的作用其实是将第一个参数所包含的菜单项追加到menu
中。
一开始,在activity
中menu
是空的,当调用了getMenuInflater().inflate(int menuRes, Menu menu)
方法后,menu中便有了菜单项,而在执行到Fragment
的onCreateOptionsMenu方法时,Activity
的menu
就传递下来,作为第一个参数,而Fragment
加载的菜单项会显示在Activity
菜单项的后面。若想只显示Fragment
的菜单项,则在Fragment
的onCreateOptionsMenu
中先调用** menu.clear() **方法,这样会将Activity
传递下来的 menu 菜单给清除掉,就不会显示了。
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
menu.clear();
super.onCreateOptionsMenu(menu, inflater);
}
- 在Fragment和Activity中如果有相同的菜单元素,并且activity和fragment都对此菜单有响应事件的话,那么将执行两次响应事件。