Android--菜单详解
Android中的菜单分为三种,即选项菜单(系统菜单),上下文菜单和弹出式菜单。
选项菜单:
一个activity只有一个选项菜单,选项菜单的创建方式有低版本创建和高版本创建两种。最常用的是干版本创建,所以这里着重高版本的创建方式的介绍。
创建步骤:
1, 在res/menu/文件夹中xml 中定义每个菜单项
<item
 android:id =" 菜单中每个Item的id"
 android:title="每个Item 文本信息"
 android:orderInCategory :Menu中显示的顺序,数字越小, 越在前面显示, 如果数字一样, 先写那个  那个就在前面位置显示
  android:showAsAcrtion:设置Menu何时和怎样显示在Action Bar中。
其中属性值:never  :   永远都不显示在Action Bar中
    always :   一直显示在Action Bar中
    ifRoom :   如果有空间 则显示在Action Bar中
/>
2, 在activity中 显示菜单项
重写父类的方法:
onCreateOptionsMenu(Menu menu)
{
//加载菜单
getMenuInflater.inflat(R.menu.main,menu);
}
3, 在activity中 每个菜单项实现点击
重新父类的方法:
onOptionsItemSelected(MenuItem item)
{
switch(item.getItemId())
{
 case R.id.action_red:
.......
 break;
}
}
低版本创建: 
//低版本的创建  /**
* groupId  分组ID
* itemId   菜单项的Id
* order    排序
* title    菜单显示的文字
*/
menu.add(menu.NONE, MENU_ONE, menu.NONE, "代码创建的菜单");
//带有子菜单的一级菜单
SubMenu subMenu = menu.addSubMenu(menu.NONE, 2, menu.NONE, "sub 1");
subMenu.add(menu.NONE, 21, 1, "sub 1-1");
subMenu.add(menu.NONE, 22, 2, "sub 1-2");
subMenu.add(menu.NONE, 23, 0, "sub 1-3");
实例:
- public class MainActivity extends Activity {
- private TextView t;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- t = (TextView) findViewById(R.id.t);
- }
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- // Inflate the menu; this adds items to the action bar if it is present.
- getMenuInflater().inflate(R.menu.main, menu);
- return true;
- }
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case R.id.red:
- t.setTextColor(Color.RED);
- t.setTextSize(12);
- break;
- case R.id.green:
- t.setTextColor(Color.GREEN);
- t.setTextSize(22);
- break;
- case R.id.blue:
- t.setTextColor(Color.BLUE);
- t.setTextSize(32);
- break;
- }
- return super.onOptionsItemSelected(item);
- }
- <item
- android:id="@+id/ACTION_COLOR"
- android:title="选择颜色">
- <menu >
- <group >
- <item
- android:id="@+id/red"
- android:title="红色" />
- <item
- android:id="@+id/green"
- android:title="绿色" />
- <item
- android:id="@+id/blue"
- android:title="蓝色" />
- </group>
- </menu>
- </item>
上下文菜单:
ContextMenu 和OptionsMenu的区
1,  OptionsMenu 的拥有者是Activity;  ContextMenu 上下文菜单的拥有者是Activity中View
2,  每个Activity中有且只有一个OptionsMenu,它为整个Activity服务;  每个Activity中可以有多个View, 那个View需要显示上下文菜单 需要为该View注册上下文菜单registerForContextMenu(View  view);
创建方式
1, 注册上下文菜单
2, res/menu/文件中的  创建每个Item项
3, 重写父类方法:  onCreateContextMenu(ContextMenu menu,View v,ContextMenuInfo menuInfo)
/**
* 当长按View时调用
* 
* ContextMenu menu
   需要显示的上下文菜单
* View v     用户选择的View
* ContextMenuInfo menuInfo 所选择界面的额外信息
*      (Spinner,ListView,GridView)
*      携带这AdapterView 的 posotion信息
--菜单可见--
4, 实现菜单项的点击: 重写父类的方法:  onContextItemSelected(MenuItem  item)
实例:
- public class MainActivity extends Activity {
- private ListView lv;
- private List<String> data = new ArrayList<String>();
- private ArrayAdapter<String> adapter;
- private int position = 0;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- lv = (ListView) findViewById(R.id.lv);
- for (int i = 0; i < 20; i++) {
- data.add("Item --->" + i);
- }
- adapter = new ArrayAdapter<String>(this,
- android.R.layout.simple_list_item_1, data);
- lv.setAdapter(adapter);
- // 1, 注册上下文对象
- registerForContextMenu(lv);
- }
- // 2, 在res/menu/中创建菜单项
- // 3, 重写父类的方法, 实现显示
- @Override
- public void onCreateContextMenu(ContextMenu menu, View v,
- ContextMenuInfo menuInfo) {
- super.onCreateContextMenu(menu, v, menuInfo);
- // 加载菜单页面
- getMenuInflater().inflate(R.menu.main, menu);
- // 获取当前选中ListView的Item的下标
- position = ((AdapterContextMenuInfo) menuInfo).position;
- }
- // 4, 重写父类的方法, 实现每个菜单项的点击
- @Override
- public boolean onContextItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case R.id.action_delete:
- // 从数据源中移除数据
- data.remove(position);
- // 刷新适配器
- adapter.notifyDataSetChanged();
- break;
- }
- return super.onContextItemSelected(item);
- }
- }
- <menu xmlns:android="http://schemas.android.com/apk/res/android" >
- <item
- android:id="@+id/action_delete"
- android:orderInCategory="100"
- android:showAsAction="never"
- android:title="删除信息"/>
- </menu>
弹出菜单:
Popup Menu    弹出式菜单      Api 必须在11以上,  可以为任意View 创建弹出式菜单
  1, 得到PopupMenu的对象
   PopupMenu pMenu = new PopupMenu(this,位置参考的UI控件);
  2, 加载菜单
   getMenuInflater.inflat(R.menu.main,menu);
  3, 为PopupMenu设置监听器
  pMenu.setOnMenuItemClickListener(.....);
  4, 显示菜单
  pMenu.show();
实例:
- public class MainActivity extends Activity {
- private TextView tv;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- tv = (TextView) findViewById(R.id.tv);
- }
- // 点击按钮弹出菜单
- public void change(View v) {
- // 得到popup对象
- PopupMenu popupMenu = new PopupMenu(MainActivity.this, v);
- // 加载菜单
- getMenuInflater().inflate(R.menu.main, popupMenu.getMenu());
- // 为 popup设置监听器
- popupMenu.setOnMenuItemClickListener(new OnMenuItemClickListener() {
- @Override
- public boolean onMenuItemClick(MenuItem item) {
- // TODO Auto-generated method stub
- switch (item.getItemId()) {
- case R.id.action_color:
- tv.setTextColor(Color.CYAN);
- break;
- case R.id.action_size:
- tv.setTextSize(20);
- break;
- }
- return false;
- }
- });
- // 显示
- popupMenu.show();
- }
- }
Android--菜单详解的更多相关文章
- Android菜单详解(四)——使用上下文菜单ContextMenu
		之前在<Android菜单详解(二)——创建并响应选项菜单>和<Android菜单详解(三)——SubMenu和IconMenu>中详细讲解了选项菜单,子菜单和图标菜单.今天接 ... 
- Android菜单详解(一)——理解android中的Menu
		前言 今天看了pro android 3中menu这一章,对Android的整个menu体系有了进一步的了解,故整理下笔记与大家分享. PS:强烈推荐<Pro Android 3>,是我至 ... 
- 【转】Android菜单详解——理解android中的Menu--不错
		原文网址:http://www.cnblogs.com/qingblog/archive/2012/06/08/2541709.html 前言 今天看了pro android 3中menu这一章,对A ... 
- 【Android】详解Android的menu菜单
		在软件应用过程中,菜单的存在是必不可少的,我这次讲一下,我对android菜单的一个基础做法吧 Android的菜单分为三种类型:选项菜单(Option Menu).上下文菜单(Context Men ... 
- Android ActionBar详解
		Android ActionBar详解 分类: Android2014-04-30 15:23 1094人阅读 评论(0) 收藏 举报 androidActionBar 目录(?)[+] 第4 ... 
- Android编译系统详解(一)
		++++++++++++++++++++++++++++++++++++++++++ 本文系本站原创,欢迎转载! 转载请注明出处: http://blog.csdn.net/mr_raptor/art ... 
- Android签名详解(debug和release)
		Android签名详解(debug和release) 1. 为什么要签名 1) 发送者的身份认证 由于开发商可能通过使用相同的Package Name来混淆替换已经安装的程序,以此保证签名不同的包 ... 
- Android编译详解之lunch命令 【转】
		本文转载自: Android编译详解之lunch命令 (2012-10-08 10:27:55) 转载▼ 标签: it 分类: android内核剖析 Android的优势就在于其开源,手机和 ... 
- Android Notification 详解(一)——基本操作
		Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ... 
- Android Notification 详解——基本操作
		Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ... 
随机推荐
- php读取指定结束指针文件内容
			fopen操作时文件读取开始指针位于文件开始部分, fseek 以指定文件大小以及开始指针位置确定结束指针位置 具体案例: <?php//打开文件流,fopen不会把文件整个加载到内存$f = ... 
- WordPress的body_class()函数详解
			wordpress的body_class()函数,顾名思义,这个函数根据不同的页面类型为body标签生成class选择器,从而让设计人员可以各方便灵活的控制不同页面中的各个元素.本文对这一函数进行了详 ... 
- 形形色色的下拉菜单 (css3)
			http://www.iteye.com/news/25339 
- Java代理模式
			java代理模式及动态代理类 1. 代理模式 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目 ... 
- BizTalk开发系列(十一) 在Orchestration中执行Pipeline
			由于开发需要有时要在流程中执行Pipeline.比如从DB的某个字段中取消息的字符串并在流程中构造消息.该需要通过pipeline进行升级 属性字段,验证消息等处理.BizTalk架构已经开放了此接口 ... 
- 【iCore3 双核心板】例程三十一:HTTP_IAP_FPGA实验——更新升级FPGA
			实验指导书及代码包下载: http://pan.baidu.com/s/1gdYnQGN iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ... 
- Python CRC16校验算法
			def crc16(x, invert): a = 0xFFFF b = 0xA001 for byte in x: a ^= ord(byte) for i in range(8): last = ... 
- MySQL常用问题解决方法
			Q: # table 损坏 Table 'table_name' is marked as crashed and should be repaired A: 恢复数据表的索引:myisamchk - ... 
- 超简易静态Web服务器
			使用 HttpListener 写的一个超简易静态Web服务器 开发环境:VS2010 + .NET2.0 http://files.cnblogs.com/zjfree/EasyIIS.rar 
- 11月30日《奥威Power-BI智能分析报表制作方法》腾讯课堂开课啦
			这么快一周就过去了,奥威公开课又要与大家见面咯,上节课老师教的三种报表集成方法你们都掌握了吗?大家都知道,学习的结果在于实际应用,想要熟练掌握新内容的要点就在于去应用它.正是基于这一要点,每一期的课程 ... 
