Menu : 意之菜单。
在Android开发中,有三种菜单:
- OptionsMeun: 选项菜单
- ContextMenu: 上下文菜单
- SubMenu: 子菜单
OptionsMenu:
按住Android手机的Menu键,就会显示OptonsMenu,它有以下要点:
- "By default, every Activity supports an options menu of actions or options. You can add items to this menu and handle clicks on your additions." ,详情请见:http://developer.android.com/reference/android/view/Menu.html
- 最多只显示6个菜单项,如果超过6个,它会以“More”形式来调出;
- 支持Title与Icon,可以设置快捷键。
- 方法:
- Activity: onCreateOptionsMenu(Menu menu) : 创建option menu,方法需要传入Menu 接口
- Activity: onOptionsItemSelected(MenuItem item): 菜单项目被选择事件,方法需要传入MenuItem接口
- Activity: onOptionsMenuClosed(Menu menu): 当菜单被关闭后,调用;
- Activity: onPrepareOptionsMenu(Menu menu): 菜单显示之前调用;如果要动态显示菜单,可以写在此方法中。
- 代码:
1 @Override 2 public boolean onCreateOptionsMenu(Menu menu) { 3 /** 4 * 1. 如果不分组,就自定义为Menu.NONE 2. id: 这个很重要:onOptionsItemSelected(MenuItem 5 * item) 根据id来判断那个菜单被选中 3. 定义菜单的排列 3. 设置Title 6 */ 7 menu.add(Menu.NONE, 1, Menu.NONE, "Dialog"); 8 menu.add(Menu.NONE, 2, Menu.NONE, "Toast"); 9 menu.add(Menu.NONE, 3, Menu.NONE, "Dialog With List"); 10 menu.add(Menu.NONE, 4, Menu.NONE, "ViewGroup"); 11 menu.add(Menu.NONE, 5, Menu.NONE, "test2").setTitle("test"); 12 menu.add(Menu.NONE, 6, Menu.NONE, "test3").setIcon( 13 R.drawable.gallery_05); 14 15 return super.onCreateOptionsMenu(menu); 16 } 17 18 @Override 19 public boolean onOptionsItemSelected(MenuItem item) { 20 switch (item.getItemId()) { 21 case 1: 22 createDialog(); 23 break; 24 25 case 2: 26 Toast.makeText(MainActivity.this, "Hello World", Toast.LENGTH_SHORT) 27 .show(); 28 break; 29 30 case 3: 31 createDialogWithList(); 32 break; 33 34 case 4: 35 startActivity(ViewGroupActivity.class); 36 37 default: 38 break; 39 } 40 41 return super.onOptionsItemSelected(item); 42 } 43 44 @Override 45 public void onOptionsMenuClosed(Menu menu) { 46 Toast.makeText(this, "OptionsMenu closed", Toast.LENGTH_SHORT).show(); 47 } 48 49 @Override 50 public boolean onPrepareOptionsMenu(Menu menu) { 51 Toast.makeText(this, "Prepare to show menu", Toast.LENGTH_SHORT).show(); 52 return true; 53 }
ContextMenu:
- 要绑定一个View,任何View都可以,EG:Button,ListView; 并且要执行Long Click动作.
- 不支持快捷键之item icon.
- Activity: onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo):创建ContextMenu
- Activity: onContextItemSelected(MenuItem item): 处理选中的菜单
- Activity: registerForContextMenu(View view) : 通常在onCreate中调用
1 <?xml version="1.0" encoding="utf-8"?> 2 <menu xmlns:android="http://schemas.android.com/apk/res/android" > 3 <item 4 android:id="@+id/item1" 5 android:checkable="true" 6 android:checked="false" 7 android:title="item1"/> 8 <item 9 android:id="@+id/item2" 10 android:title="item2"/> 11 <item 12 android:id="@+id/item3" 13 android:title="sub menu"> 14 <menu> 15 <item 16 android:id="@+id/sub1" 17 android:title="sub1"/> 18 </menu> 19 </item> 20 </menu>
1 @Override 2 public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo){ 3 super.onCreateContextMenu(menu, v, menuInfo); 4 menu.setHeaderTitle("context menu test"); 5 menu.setHeaderIcon(android.R.drawable.ic_menu_share); 6 getMenuInflater().inflate(R.menu.test_menu, menu); 7 } 8 @Override 9 public boolean onContextItemSelected(MenuItem item){ 10 switch (item.getItemId()) { 11 case R.id.item1: 12 item.setChecked(true); 13 break; 14 case R.id.item2: 15 default: 16 break; 17 } 18 return super.onContextItemSelected(item); 19 }
为方便大家自定义,这里没有提供onCreate方法,如果要实现ContextMenu效果需要在onCreate方法中调用: registerForContextMenu(View)方法;
Sub menu
比较简单:http://developer.android.com/reference/android/view/SubMenu.html
但是需要注意Sub menu不能添加子菜单,它Options menu及Context menu是可以添加之菜单的;由此可见在Android中菜单的深度只有二层。