需求
當(dāng) Toolbar
布局放在底層的 Activity
中啸胧, 而Toolbar
上的菜單需要根據(jù)切換的 Fragment
進(jìn)行切換時(shí)扳缕。
分析
Fragment
和Activity
一樣瘾蛋,可以重寫onCreateOptionsMenu
方法來(lái)設(shè)定自己的菜單砌烁,其實(shí)這兩個(gè)地方使用onCreateOptionsMenu
的目的和效果都是完全一樣的篱蝇,但是由于Fragment
是從屬于Activity
的蔚万,因此使用onCreateOptionsMenu
的時(shí)候需要注意以下幾點(diǎn)岭妖。
-
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.一個(gè)有返回值,一個(gè)沒(méi)有
?2.Fragment的onCreateOptionsMenu的方法多了一個(gè)MenuInflater參數(shù)
- 想讓
Fragment中
的onCreateOptionsMenu
方法生效必須先調(diào)用setHasOptionsMenu
方法
官方文檔說(shuō)明如下:
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都同時(shí)inflate了一個(gè)menu資源文件,那么menu資源所包含的菜單會(huì)出現(xiàn)兩次
?這是因?yàn)?code>inflater.inflate(int menuRes, Menu menu)方法的作用其實(shí)是將第一個(gè)參數(shù)所包含的菜單項(xiàng)追加到menu
中昵慌。
?一開(kāi)始假夺,在activity
中menu
是空的,當(dāng)調(diào)用了getMenuInflater().inflate(int menuRes, Menu menu)
方法后斋攀,menu中便有了菜單項(xiàng)已卷,而在執(zhí)行到Fragment
的onCreateOptionsMenu方法時(shí),Activity
的menu
就傳遞下來(lái)蜻韭,作為第一個(gè)參數(shù)悼尾,而Fragment
加載的菜單項(xiàng)會(huì)顯示在Activity
菜單項(xiàng)的后面。若想只顯示Fragment
的菜單項(xiàng)肖方,則在Fragment
的onCreateOptionsMenu
中先調(diào)用** menu.clear() **方法闺魏,這樣會(huì)將Activity
傳遞下來(lái)的 menu 菜單給清除掉,就不會(huì)顯示了俯画。
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
menu.clear();
super.onCreateOptionsMenu(menu, inflater);
}
- 在Fragment和Activity中如果有相同的菜單元素析桥,并且activity和fragment都對(duì)此菜單有響應(yīng)事件的話,那么將執(zhí)行兩次響應(yīng)事件艰垂。