##Menu的創(chuàng)建,選擇監(jiān)聽
```
/**
* 此方法用于初始化上下文菜單 并只會(huì)在第一次初始化菜單時(shí)調(diào)用
* 其中參數(shù)menu就是即將要顯示的Menu的實(shí)例
* 返回true 則顯示該菜單? 返回false不顯示
*
* @param menu
* @return
*/
@Override
public boolean onCreateOptionsMenu(Menu menu) {
return super.onCreateOptionsMenu(menu);
}
/**
* 在onCreateOptionsMenu 方法調(diào)用后 菜單被顯示前調(diào)用
* 返回true顯示該菜單 返回false 不顯示
*
* @param menu
* @return
*/
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
return super.onPrepareOptionsMenu(menu);
}
/**
* 菜單被關(guān)閉的時(shí)候被調(diào)用
* 菜單被關(guān)閉有三種情景 menu按鈕再次被點(diǎn)擊? back被點(diǎn)擊? 某一個(gè)子菜單被選中
*
* @param menu
*/
@Override
public void onOptionsMenuClosed(Menu menu) {
super.onOptionsMenuClosed(menu);
}
/**
* 菜單項(xiàng)被點(diǎn)擊的時(shí)候被調(diào)用
*
* @param item
* @return
*/
@Override
public boolean onOptionsItemSelected(MenuItem item) {
return super.onOptionsItemSelected(item);
}
```
##添加菜單
從??的方法中可以看出可以在onCreateOptionMenu或者onPrepareOptionsMenu方法中創(chuàng)建菜單,同時(shí)需要注意的是通過這兩個(gè)方法有兩種添加菜單的方式
```
通過調(diào)用方法
public MenuItem add(int groupId, int itemId, int order, CharSequence title);
來完成菜單的添加,四個(gè)參數(shù)依次是
1.組id? 如果不分組的話就寫Menu.NONE
2.itemId 這個(gè)就是在子菜單被點(diǎn)擊時(shí)用于判斷區(qū)分用的id
3.子菜單的顯示順序? 哪個(gè)菜單項(xiàng)在前面由這個(gè)參數(shù)的大小決定
4.標(biāo)題 菜單顯示的文本
```
```
通過調(diào)用布局文件添加
public boolean onPrepareOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main,menu);
return true;
}
通過調(diào)用Activity的getMenuInflater 得到一個(gè)MenuInflater 在通過inflate方法加載布局文件中定義的菜單 這樣就加載給第二個(gè)參數(shù)所對(duì)應(yīng)的menu
```
##在Fragment中添加菜單
在自己的Fragment中也有onCreateOptionMenu和onPrepareOptionsMenu這兩個(gè)方法,通過在fragment中實(shí)現(xiàn)兩個(gè)方法添加的菜單會(huì)被添加到已有菜單之后,選中菜單項(xiàng)時(shí) fragment也會(huì)接收onOptionsItemSelected()回調(diào).需要注意的是用戶點(diǎn)擊菜單的信息首先傳遞給activity 如果activity不處理 則傳遞給fragment
```
需要注意的是為了確保回調(diào)成功 需要在fragment的onCreate()方法中調(diào)用setHasOptionsMenu() 告知Options Menu? fragment要添加菜單項(xiàng)
```