常用的菜单有:
OptionMenu(系统菜单):当点击手机的菜单键时,出现在应用顶部下的菜单。
ContextMenu(上下文菜单):当长按某一UI控件时,出现的菜单。
PopupMenu(弹出菜单):当点击某一UI控件时,弹出的菜单。
SubMenu(子菜单):当点击某一菜单的菜单项时,出现的下一级菜单。
下面主要总结前三种菜单的用法:
1.OptionMenu使用:重写Activity的回调方法onCreateOptionsMenu()创建选项菜单,同时一般肯定会对菜单项进行监听,所以同时会重写onOptionsItemSelected()。菜单项可以在menu文件夹下定义xml菜单项文件。
eg:
1 // 创建系统菜单 2 @Override 3 public boolean onCreateOptionsMenu(Menu menu) { 4 // 将Menu文件转化为菜单的菜单项 5 getMenuInflater().inflate(R.menu.main, menu); 6 return true; 7 }
getMenuInflater()获得一个MenuInflater对象,和getLayoutInflater()方法类似,都是获取一个Inflater对象,其中getMenuInflater().inflater()是将菜单项布局文件转换为视图对象进而绑定在系统菜单上,而getLayoutInflater().inflater()则是将指定布局xml文件转化为View对象。进一步扩展,在非Activity中获取LayoutInflater对象,可以通过LayoutInflater.from(context)得到,但是没有MenuInflater.from(context)方法。
1 // 设置点击系统菜单项的监听事件 2 @Override 3 public boolean onOptionsItemSelected(MenuItem item) { 4 Toast.makeText(this, "点击了" + item.getTitle(), Toast.LENGTH_SHORT) 5 .show(); 6 return super.onOptionsItemSelected(item); 7 }
new MenuItem().getTitle()是一个比较有用的方法,菜单项的定义一般是用xml文件定义的,那么怎么获取xml文件中菜单项显示的文本呢?通过MunuItem的getTitle()这个方法可以获取xml文件中定义的菜单项文本,也就是获取了界面上出现的菜单项中文本。
点击菜单键出现的系统菜单效果图:
2.ContextMenu使用:第一步需要为需要添加上下文菜单的控件注册,通过调用registerForContextMenu(view)来完成注册,第二步是通过重写onCreateContextMenu()方法创建上下文菜单,第三部也就是为上下文菜单中的菜单项添加监听事件,重写onContextItemSelected完成事件监听。可以看到后两步的操作和OptionMenu思路类似,唯一不同的是ContextMenu必须要注册才能使用。
eg:
1 // 为listView注册上下文菜单 2 registerForContextMenu(listView);
1 // 创建上下文菜单 2 @Override 3 public void onCreateContextMenu(ContextMenu menu, View v, 4 ContextMenuInfo menuInfo) { 5 // 将Menu文件转化为菜单的菜单项 6 getMenuInflater().inflate(R.menu.context_menu, menu); 7 super.onCreateContextMenu(menu, v, menuInfo); 8 }
1 // 设置点击上下文菜单项的监听事件 2 @Override 3 public boolean onContextItemSelected(MenuItem item) { 4 Toast.makeText(this, "点击了" + item.getTitle(), Toast.LENGTH_SHORT) 5 .show(); 6 return super.onContextItemSelected(item); 7 }
ContextMenu使用的后两个方法结构和OptionMenu使用的方法完全相同。
长按ListView中的任意一项数据项出现的ContextMenu效果图:
3.PopupMenu的使用:首先为某个控件添加点击事件,然后在调用的点击事件中创建PopupMenu对象,为PopupMenu对象设置菜单项,为PopupMenu设置监听事件,最后将PopupMenu显示出来。
1 // 点击按钮时,出现弹出菜单 2 public void popupMenu(View view) { 3 // 第二个参数是设置弹出菜单出现在那个组件上 4 PopupMenu popupMenu = new PopupMenu(this, view); 5 6 // 为弹出菜单添加菜单项 7 // new PopupMenu().getMenu(),返回一个Menu对象 8 getMenuInflater().inflate(R.menu.popup_menu, popupMenu.getMenu()); 9 10 // 设置弹出菜单项的监听事件 11 popupMenu.setOnMenuItemClickListener(new OnMenuItemClickListener() { 12 @Override 13 public boolean onMenuItemClick(MenuItem item) { 14 Toast.makeText(MainActivity.this, "点击了" + item.getTitle(), 15 Toast.LENGTH_SHORT).show(); 16 return false; 17 } 18 }); 19 20 // 将弹出菜单显示出来 21 popupMenu.show(); 22 }
点击按钮出现的PopupMenu的效果图:
示例:初始界面如下图,上方是一个ListView,下方是一个按钮,当点击返回键出现系统菜单,当点击ListView的任意一个数据项出现上下文菜单,当点击下方的按钮出现弹出菜单.
MainActivity的源代码:
1 package com.my.day22_my_menu; 2 3 import android.os.Bundle; 4 import android.app.Activity; 5 import android.view.ContextMenu; 6 import android.view.Menu; 7 import android.view.MenuItem; 8 import android.view.View; 9 import android.view.ContextMenu.ContextMenuInfo; 10 import android.widget.ArrayAdapter; 11 import android.widget.ListView; 12 import android.widget.PopupMenu; 13 import android.widget.PopupMenu.OnMenuItemClickListener; 14 import android.widget.Toast; 15 16 public class MainActivity extends Activity { 17 private ListView listView; 18 19 @Override 20 protected void onCreate(Bundle savedInstanceState) { 21 super.onCreate(savedInstanceState); 22 setContentView(R.layout.activity_main); 23 24 listView = (ListView) findViewById(R.id.listView); 25 listView.setAdapter(new ArrayAdapter<String>(this, 26 android.R.layout.simple_list_item_1, new String[] { "第一条数据项", 27 "第二条数据项", "第三条数据项" })); 28 29 // 为listView注册上下文菜单 30 registerForContextMenu(listView); 31 } 32 33 // 创建系统菜单 34 @Override 35 public boolean onCreateOptionsMenu(Menu menu) { 36 // 将Menu文件转化为菜单的菜单项 37 getMenuInflater().inflate(R.menu.main, menu); 38 return true; 39 } 40 41 // 设置点击系统菜单项的监听事件 42 @Override 43 public boolean onOptionsItemSelected(MenuItem item) { 44 Toast.makeText(this, "点击了" + item.getTitle(), Toast.LENGTH_SHORT) 45 .show(); 46 return super.onOptionsItemSelected(item); 47 } 48 49 // 创建上下文菜单 50 @Override 51 public void onCreateContextMenu(ContextMenu menu, View v, 52 ContextMenuInfo menuInfo) { 53 // 将Menu文件转化为菜单的菜单项 54 getMenuInflater().inflate(R.menu.context_menu, menu); 55 super.onCreateContextMenu(menu, v, menuInfo); 56 } 57 58 // 设置点击上下文菜单项的监听事件 59 @Override 60 public boolean onContextItemSelected(MenuItem item) { 61 Toast.makeText(this, "点击了" + item.getTitle(), Toast.LENGTH_SHORT) 62 .show(); 63 return super.onContextItemSelected(item); 64 } 65 66 // 点击按钮时,出现弹出菜单 67 public void popupMenu(View view) { 68 // 第二个参数是设置弹出菜单出现在那个组件上 69 PopupMenu popupMenu = new PopupMenu(this, view); 70 71 // 为弹出菜单添加菜单项 72 // new PopupMenu().getMenu(),返回一个Menu对象 73 getMenuInflater().inflate(R.menu.popup_menu, popupMenu.getMenu()); 74 75 // 设置弹出菜单项的监听事件 76 popupMenu.setOnMenuItemClickListener(new OnMenuItemClickListener() { 77 @Override 78 public boolean onMenuItemClick(MenuItem item) { 79 Toast.makeText(MainActivity.this, "点击了" + item.getTitle(), 80 Toast.LENGTH_SHORT).show(); 81 return false; 82 } 83 }); 84 85 // 将弹出菜单显示出来 86 popupMenu.show(); 87 } 88 }
未完,待续。