需求
当 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都对此菜单有响应事件的话,那么将执行两次响应事件。