安卓开发复习笔记——Menu菜单组件(选项菜单,上下文菜单,子菜单)
菜单是用户界面中最常见的元素之一,使用非常频繁,在Android中,菜单被分为如下三种,选项菜单(OptionsMenu)、上下文菜单(ContextMenu)和子菜单(SubMenu)。
菜单的实现方式有2种:一种是通过布局文件xml生成菜单,另一种是通过代码生成。
三种菜单内容有点多,不过大体相似,一次性讲完吧,本人偏好代码动态生成,下面就以代码为例。
1、选项菜单(OptionsMenu)
先来看下选项菜单的效果图:
在一个Activity界面中点击手机Menu键,在屏幕下方弹出的菜单就叫选项菜单(OptionsMenu)。
先来了解下主要的方法:
1 public boolean onCreateOptionsMenu(Menu menu)://使用此方法调用OptionsMenu 。 2 3 public boolean onOptionsItemSelected(MenuItem item)://选中菜单项后发生的动作。 4 5 public void onOptionsMenuClosed(Menu menu): //菜单关闭后发生的动作。 6 7 public boolean onPrepareOptionsMenu(Menu menu)://选项菜单显示之前onPrepareOptionsMenu方法会被调用,你可以用此方法来根据打当时的情况调整菜单。 8 9 public boolean onMenuOpened(int featureId, Menu menu)://单打开后发生的动作。
下面来看个小Demo,注释很全。
1 package com.example.menutest; 2 3 import android.app.Activity; 4 import android.content.Intent; 5 import android.os.Bundle; 6 import android.view.Menu; 7 import android.view.MenuItem; 8 import android.widget.Toast; 9 10 /** 11 * 12 * @author Balla_兔子 13 * 用代码动态生成菜单(选项菜单) 14 * 15 */ 16 public class MainActivity extends Activity { 17 18 @Override 19 protected void onCreate(Bundle savedInstanceState) { 20 super.onCreate(savedInstanceState); 21 setContentView(R.layout.activity_main); 22 } 23 24 @Override 25 //onCreateOptionsMenu()此方法只会调用一次,即第一次显示的时候会调用. 26 public boolean onCreateOptionsMenu(Menu menu) { 27 // MenuItem item1=menu.add(1, 1, 1, "第一个选项菜单"); 28 // item1.setTitle("第一个选项菜单"); 29 // item1.setIcon(R.drawable.ic_launcher); 30 menu.add(1, 1, 1, "第一个选项菜单"); 31 menu.add(1, 2, 1, "第二个选项菜单"); 32 menu.add(1, 3, 1, "第三个选项菜单"); 33 menu.add(1, 4, 1, "第四个选项菜单"); 34 return super.onCreateOptionsMenu(menu); 35 } 36 37 @Override 38 //如果需要更新菜单项.可以在onPrepareOptionsMenu()方法中操作. 39 public boolean onPrepareOptionsMenu(Menu menu) { 40 Toast.makeText(this, "菜单显示器前执行的方法", Toast.LENGTH_SHORT).show(); 41 return super.onPrepareOptionsMenu(menu); 42 } 43 44 @Override 45 public void onOptionsMenuClosed(Menu menu) { 46 Toast.makeText(this, "菜单关闭后执行的方法", Toast.LENGTH_SHORT).show(); 47 super.onOptionsMenuClosed(menu); 48 } 49 50 @Override 51 //当菜单被选择的时候,在OnOptionsItemSelected()方法中实现. 52 public boolean onOptionsItemSelected(MenuItem item) { 53 switch(item.getItemId()){//获取菜单id 54 case 1: 55 //可以通过Intent跳转界面 56 Intent intent=new Intent(MainActivity.this, HelloWorld.class); 57 item.setIntent(intent); 58 break; 59 case 2: 60 Toast.makeText(this, "第二个选项菜单被点击", Toast.LENGTH_SHORT).show(); 61 break; 62 case 3: 63 Toast.makeText(this, "第三个选项菜单被点击", Toast.LENGTH_SHORT).show(); 64 break; 65 case 4: 66 Toast.makeText(this, "第四个选项菜单被点击", Toast.LENGTH_SHORT).show(); 67 break; 68 } 69 return super.onOptionsItemSelected(item); 70 } 71 72 }
上面例子中,在创建菜单方法onCreateOptionsMenu()中有个add方法,它的返回值是一个MenuItem,我们可以根据它的返回值来设置更多选择,例如菜单图标等。
来看下它的参数,下面是它对应的API文档中的解释:参数1:分组,参数2:标示符id,参数3:排序,参数4:菜单文字
2、上下文菜单
国际惯例,先来看下效果图:
什么是上下文菜单?
Android 的上下文菜单类似于Windows上的右键菜单。当为一个视图注册了上下文菜单之后,长按(2 秒左右)这个视图对象就会弹出一个浮动菜单,即上下文菜单。任何视图都可以注册上下文菜单,不过,最常见的是用于列表视图ListView的item。
创建上下文菜单步骤:
1、 覆写 Activity 的 onCreateContenxtMenu() 方法,调用 Menu 的 add 方法添加菜单项(MenuItem)。
2、覆盖 Activity 的 onContextItemSelected() 方法,响应上下文菜单菜单项的单击事件。
3、调用 registerForContextMenu() 方法,为视图注册上下文菜单。
下面直接上个小Demo演示了,对于ListView组件这里就不再给注释了,不清楚的朋友可以翻下我以前写的文章。
1 package com.example.menutest; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.view.ContextMenu; 6 import android.view.ContextMenu.ContextMenuInfo; 7 import android.view.Menu; 8 import android.view.MenuItem; 9 import android.view.View; 10 import android.widget.ArrayAdapter; 11 import android.widget.ListView; 12 import android.widget.Toast; 13 14 /** 15 * 16 * @author Balla_兔子 17 * 用代码动态生成菜单(上下文菜单) 18 * 19 */ 20 public class MainActivity extends Activity { 21 22 private ListView listview; 23 private ArrayAdapter<String> adapter; 24 private String info[]={"选项1","选项2","选项3","选项4","选项5","选项6"}; 25 26 @Override 27 protected void onCreate(Bundle savedInstanceState) { 28 super.onCreate(savedInstanceState); 29 setContentView(R.layout.activity_main); 30 //创建一个ListView列表 31 listview=(ListView) findViewById(R.id.listview); 32 adapter=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, info); 33 listview.setAdapter(adapter); 34 35 36 //给当前View注册上下文菜单. 37 this.registerForContextMenu(listview); 38 39 } 40 41 @Override 42 public void onCreateContextMenu(ContextMenu menu, View v, 43 ContextMenuInfo menuInfo) { 44 menu.setHeaderTitle("我是上下文菜单");//设置上下文菜单题目 45 menu.setHeaderIcon(R.drawable.ic_launcher);//设置上下文菜单题目图标 46 menu.add(1, 1, 1, "我是上下文菜单选项1"); 47 menu.add(1, 2, 1, "我是上下文菜单选项2"); 48 menu.add(1, 3, 1, "我是上下文菜单选项3"); 49 menu.add(1, 4, 1, "我是上下文菜单选项4"); 50 } 51 52 @Override 53 public boolean onContextItemSelected(MenuItem item) { 54 switch(item.getItemId()){ 55 case 1: 56 Toast.makeText(this, "点击上下文菜单选项1", Toast.LENGTH_SHORT).show(); 57 break; 58 case 2: 59 Toast.makeText(this, "点击上下文菜单选项2", Toast.LENGTH_SHORT).show(); 60 break; 61 case 3: 62 Toast.makeText(this, "点击上下文菜单选项3", Toast.LENGTH_SHORT).show(); 63 break; 64 case 4: 65 Toast.makeText(this, "点击上下文菜单选项4", Toast.LENGTH_SHORT).show(); 66 break; 67 68 } 69 return super.onContextItemSelected(item); 70 } 71 72 @Override 73 //关闭上下文菜单触发此方法 74 public void onContextMenuClosed(Menu menu) { 75 Toast.makeText(this, "关闭上下文菜单", Toast.LENGTH_SHORT).show(); 76 } 77 78 79 80 81 82 }
3、子菜单
先看下效果图:
创建子菜单的步骤:
1、 覆写Activity的onCreateOptionsMenu()方法,调用Menu的addSubMenu()方法来添加子菜单
2、 调用SubMenu的add()方法,添加子菜单项(addSubMenu)
3、 覆写onOptionsItemSelected()方法,响应子菜单的单击事件
子菜单提供了一种自然的组织菜单项的方式,我们可以通过addSubMenu(int groupId, int itemId, int order, int titleRes)方法非常方便的创建和响应子菜单。
代码和之前创建选项菜单,上下文菜单差不多,直接上代码了:
1 package com.example.menutest; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.view.Menu; 6 import android.view.MenuItem; 7 import android.view.SubMenu; 8 import android.widget.Toast; 9 10 /** 11 * 12 * @author Balla_兔子 13 * 用代码动态生成菜单(子菜单) 14 * 15 */ 16 public class MainActivity extends Activity { 17 18 19 @Override 20 protected void onCreate(Bundle savedInstanceState) { 21 super.onCreate(savedInstanceState); 22 setContentView(R.layout.activity_main); 23 } 24 25 @Override 26 public boolean onCreateOptionsMenu(Menu menu) { 27 SubMenu s1=menu.addSubMenu(1, 0, 1, "我是菜单1"); 28 s1.setIcon(R.drawable.ic_launcher);//设置子菜单图标 29 s1.setHeaderTitle("子菜单");//设置子菜单标题 30 s1.add(1, 1, 1, "我是子菜单1"); 31 s1.add(1, 2, 1, "我是子菜单2"); 32 s1.add(1, 3, 1, "我是子菜单3"); 33 s1.add(1, 4, 1, "我是子菜单4"); 34 35 SubMenu s2=menu.addSubMenu(2, 0, 1, "我是菜单2"); 36 s2.setIcon(R.drawable.ic_launcher); 37 s2.setHeaderTitle("子菜单"); 38 s2.add(2, 1, 1, "我是子菜单(1)"); 39 s2.add(2, 2, 1, "我是子菜单(2)"); 40 s2.add(2, 3, 1, "我是子菜单(3)"); 41 s2.add(2, 4, 1, "我是子菜单(4)"); 42 43 return super.onCreateOptionsMenu(menu); 44 } 45 46 @Override 47 public boolean onOptionsItemSelected(MenuItem item) { 48 if(item.getGroupId()==1){//判断分组 49 switch(item.getItemId()){ 50 case 1: 51 Toast.makeText(MainActivity.this, "菜单1的子菜单1被点击", Toast.LENGTH_SHORT).show(); 52 break; 53 case 2: 54 Toast.makeText(MainActivity.this, "菜单1的子菜单2被点击", Toast.LENGTH_SHORT).show(); 55 break; 56 case 3: 57 Toast.makeText(MainActivity.this, "菜单1的子菜单3被点击", Toast.LENGTH_SHORT).show(); 58 break; 59 case 4: 60 Toast.makeText(MainActivity.this, "菜单1的子菜单4被点击", Toast.LENGTH_SHORT).show(); 61 break; 62 63 } 64 }else if(item.getGroupId()==2){ 65 switch(item.getItemId()){ 66 case 1: 67 Toast.makeText(MainActivity.this, "菜单2的子菜单1被点击", Toast.LENGTH_SHORT).show(); 68 break; 69 case 2: 70 Toast.makeText(MainActivity.this, "菜单2的子菜单2被点击", Toast.LENGTH_SHORT).show(); 71 break; 72 case 3: 73 Toast.makeText(MainActivity.this, "菜单2的子菜单3被点击", Toast.LENGTH_SHORT).show(); 74 break; 75 case 4: 76 Toast.makeText(MainActivity.this, "菜单2的子菜单4被点击", Toast.LENGTH_SHORT).show(); 77 break; 78 } 79 } 80 81 return super.onOptionsItemSelected(item); 82 } 83 84 }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。