菜单资源文件一般放在/res/menu目录下,菜单资源的根元素通常是<menu />,<menu />,元素无需指定任何属性,它可以包含子元素:
<item />:定义菜单项
<group />:将多个item定义的菜单包装成一个菜单组。
一般推荐使用XML文件定义菜单。
eg.定义菜单的经典例子
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:title="@string/font_size" android:icon="@drawable/font"> <menu> <!-- 定义一组单选菜单项 --> <group android:checkableBehavior="single"> <!-- 定义多个菜单项 --> <item android:id="@+id/font_10" android:title="@string/font_10"/> <item android:id="@+id/font_12" android:title="@string/font_12"/> <item android:id="@+id/font_14" android:title="@string/font_14"/> <item android:id="@+id/font_16" android:title="@string/font_16"/> <item android:id="@+id/font_18" android:title="@string/font_18"/> </group> </menu> </item> <!-- 定义一个普通菜单项 --> <item android:id="@+id/plain_item" android:title="@string/plain_item"> </item> <item android:title="@string/font_color" android:icon="@drawable/color"> <menu> <!-- 定义一组允许复选的菜单项 --> <group> <!-- 定义3个菜单项 --> <item android:id="@+id/red_font" android:title="@string/red_title"/> <item android:id="@+id/green_font" android:title="@string/green_title"/> <item android:id="@+id/blue_font" android:title="@string/blue_title"/> </group> </menu> </item> </menu>
而菜单项被单击后回调的一般写法如下:
@Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflator = new MenuInflater(this); // 状态R.menu.context对应的菜单,并添加到menu中 inflator.inflate(R.menu.my_menu, menu); return super.onCreateOptionsMenu(menu); } @Override // 选项菜单的菜单项被单击后的回调方法 public boolean onOptionsItemSelected(MenuItem mi) { if(mi.isCheckable()) { mi.setChecked(true); //② } // 判断单击的是哪个菜单项,并针对性的作出响应。 switch (mi.getItemId()) { case R.id.font_10: txt.setTextSize(10 * 2); break; case R.id.font_12: txt.setTextSize(12 * 2); break; case R.id.font_14: txt.setTextSize(14 * 2); break; case R.id.font_16: txt.setTextSize(16 * 2); break; case R.id.font_18: txt.setTextSize(18 * 2); break; case R.id.red_font: txt.setTextColor(Color.RED); mi.setChecked(true); break; case R.id.green_font: txt.setTextColor(Color.GREEN); mi.setChecked(true); break; case R.id.blue_font: txt.setTextColor(Color.BLUE); mi.setChecked(true); break; case R.id.plain_item: Toast toast = Toast.makeText(MenuResTest.this, "您单击了普通菜单项", Toast.LENGTH_SHORT); toast.show(); break; } return true; }
二、上下文菜单 ContextMenu
用户长按界面时会出现的菜单项称为上下文菜单。
创建上下文菜单的资源文件:
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 定义一组单选菜单项目 --> <group android:checkableBehavior="single"> <!-- 定义3个菜单项 --> <item android:id="@+id/red" android:title="@string/red_title" android:alphabeticShortcut="r"/> <item android:id="@+id/green" android:title="@string/green_title" android:alphabeticShortcut="g"/> <item android:id="@+id/blue" android:title="@string/blue_title" android:alphabeticShortcut="b"/> </group> </menu>
为某一组件注册上下文菜单以及菜单项被单击后回调的方法
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); txt = (TextView) findViewById(R.id.txt); // 为文本框注册上下文菜单 registerForContextMenu(txt); } // 创建上下文菜单时触发该方法 @Override public void onCreateContextMenu(ContextMenu menu, View source, ContextMenu.ContextMenuInfo menuInfo) { MenuInflater inflator = new MenuInflater(this); // 状态R.menu.context对应的菜单,并添加到menu中 inflator.inflate(R.menu.context, menu); menu.setHeaderIcon(R.drawable.tools); menu.setHeaderTitle("请选择背景色"); } // 上下文菜单中菜单项被单击时触发该方法。 @Override public boolean onContextItemSelected(MenuItem mi) { mi.setChecked(true); //① switch (mi.getItemId()) { case R.id.red: mi.setChecked(true); txt.setBackgroundColor(Color.RED); break; case R.id.green: mi.setChecked(true); txt.setBackgroundColor(Color.GREEN); break; case R.id.blue: mi.setChecked(true); txt.setBackgroundColor(Color.BLUE); break; } return true; }
三、PopupMenu 弹出式菜单
会在指定组件上弹出菜单项,默认情况下,PopupMenu会显示在该组件的下方或上方。
eg.创建PopupMenu并为Popup菜单的菜单项的单击事件绑定监听器
// 创建PopupMenu对象 popup = new PopupMenu(this, button); // 将R.menu.popup_menu菜单资源加载到popup菜单中 getMenuInflater().inflate(R.menu.popup_menu, popup.getMenu()); // 为popup菜单的菜单项单击事件绑定事件监听器 popup.setOnMenuItemClickListener( new PopupMenu.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { switch (item.getItemId()) { case R.id.exit: // 隐藏该对话框 popup.dismiss(); break; default: // 使用Toast显示用户点击的菜单项 Toast.makeText(PopupMenuTest.this, "您单击了【" + item.getTitle() + "】菜单项" , Toast.LENGTH_SHORT).show(); } return true; } }); popup.show(); }