##Menu的创建,选择监听
```
/**
* 此方法用于初始化上下文菜单 并只会在第一次初始化菜单时调用
* 其中参数menu就是即将要显示的Menu的实例
* 返回true 则显示该菜单 返回false不显示
*
* @param menu
* @return
*/
@Override
public boolean onCreateOptionsMenu(Menu menu) {
return super.onCreateOptionsMenu(menu);
}
/**
* 在onCreateOptionsMenu 方法调用后 菜单被显示前调用
* 返回true显示该菜单 返回false 不显示
*
* @param menu
* @return
*/
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
return super.onPrepareOptionsMenu(menu);
}
/**
* 菜单被关闭的时候被调用
* 菜单被关闭有三种情景 menu按钮再次被点击 back被点击 某一个子菜单被选中
*
* @param menu
*/
@Override
public void onOptionsMenuClosed(Menu menu) {
super.onOptionsMenuClosed(menu);
}
/**
* 菜单项被点击的时候被调用
*
* @param item
* @return
*/
@Override
public boolean onOptionsItemSelected(MenuItem item) {
return super.onOptionsItemSelected(item);
}
```
##添加菜单
从👆的方法中可以看出可以在onCreateOptionMenu或者onPrepareOptionsMenu方法中创建菜单,同时需要注意的是通过这两个方法有两种添加菜单的方式
```
通过调用方法
public MenuItem add(int groupId, int itemId, int order, CharSequence title);
来完成菜单的添加,四个参数依次是
1.组id 如果不分组的话就写Menu.NONE
2.itemId 这个就是在子菜单被点击时用于判断区分用的id
3.子菜单的显示顺序 哪个菜单项在前面由这个参数的大小决定
4.标题 菜单显示的文本
```
```
通过调用布局文件添加
public boolean onPrepareOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main,menu);
return true;
}
通过调用Activity的getMenuInflater 得到一个MenuInflater 在通过inflate方法加载布局文件中定义的菜单 这样就加载给第二个参数所对应的menu
```
##在Fragment中添加菜单
在自己的Fragment中也有onCreateOptionMenu和onPrepareOptionsMenu这两个方法,通过在fragment中实现两个方法添加的菜单会被添加到已有菜单之后,选中菜单项时 fragment也会接收onOptionsItemSelected()回调.需要注意的是用户点击菜单的信息首先传递给activity 如果activity不处理 则传递给fragment
```
需要注意的是为了确保回调成功 需要在fragment的onCreate()方法中调用setHasOptionsMenu() 告知Options Menu fragment要添加菜单项
```