系统组件:菜单Menu(1)

  常用的菜单有:

    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 }

未完,待续。

时间: 2024-10-28 19:08:41

系统组件:菜单Menu(1)的相关文章

解决android4.0系统中菜单(Menu)添加Icon无效问题

在Android4.0系统中,创建菜单Menu,通过setIcon方法给菜单添加图标是无效的,图标没有显出来,2.3系统中是可以显示出来的.这个问题的根本原因在于4.0系统中,涉及到菜单的源码类 MenuBuilder做了改变,该类的部分源码如下: 1 public class MenuBuilder implements Menu { 2 ... 3 private boolean mOptionalIconsVisible = false; 4 .... 5 void setOptional

用cocos2d-html5做的消除类游戏《英雄爱消除》(1)——系统主菜单

系统主菜单如下图所示: 首先,介绍下这个主菜单,它包含了一个动画logo以及一个按钮选项,动画logo每隔1秒钟切换一张图片,点击相应的按钮选项会切换不同的游戏场景. 下面看下这个界面的源码: /** * Power by html5中文网(html5china.com) * author: jackyWHJ */ cc.dumpConfig(); var winSize; var SysMenu = cc.Layer.extend({ _hero:null, _logo:null, _logo

信息化系统导航菜单样式实现

实现的菜单效果:  选中的是绿色的菜单,其余为灰色的. 实现方法:具体菜单使用图片代替,不采用文字和css组合实现. 主要JS代码: 点击菜单的时候,先遍历移除已有的选中菜单样式,然后再添加新的菜单对应样式 changeC(id,img); var index=img.indexOf("."); var imgPath='<%=basePath %>images/menu/'+img.substring(0,index)+'w.png'; document.getEle

关于解决android4.0系统中菜单无法添加Icon的问题

在Android4.0系统中,创建菜单Menu,然后通过setIcon方法给菜单添加图标是无效的,图标不会显出来,而之前的系统中是可以显示出来的.这个问题的根本原因在于4.0系统中,涉及到菜单的源码类 MenuBuilder做了改变,其中有private boolean mOptionalIconsVisible = false;属性使得无法显示菜单图标. 但是,我们又无法在开发的应用程序中创建MenuBuilder这个对象的(因为MenuBuilder是系统内部的框架类). 当然如果不是很需要

[原]Unity3D深入浅出 - 认识开发环境中的Component(组件)菜单

Component(组件)是用来添加到GameObject对象上的一组相关属性,本质上每个组件都是一个实例,比如在Cube上添加一个Mesh网格,即面向对象的思维方式可以理解成Cube对象里包含了一个Mesh对象. Component主要包含以下组件:  Mesh:添加网格类型的组件 Mesh Filter:网格过滤器 Text Mesh:文本网格 Mesh Renderer:网格渲染器 Effects:添加特效类型组件 Particle System:粒子系统 Trail Renderer:拖

Android-上下文菜单Menu

上一篇博客介绍了,Android-普通菜单Menu,而这篇博客介绍Android-上下文菜单Menu AndroidManifest.xml 中加入权限: <!-- 读取联系人数据的权限 --> <uses-permission android:name="android.permission.READ_CONTACTS"/> <!-- 读取通话记录的全身 --> <uses-permission android:name="andr

系统组件-锁屏应用

package com.xfeng.onekeylock; import android.app.admin.DevicePolicyManager; import android.content.ComponentName; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; publ

而且很多系统组件和应用将会通过 Windows Store 来更新

本周微软推送了第三波 Windows 10 累积更新,也是本周的第二波更新,已经通过 Windows Update 推送给所有用户. 这次的 Windows 10 累积更新并没有提供详细信息,更新编号是 KB3081438,包括“Windows 10 功能增强的改进”,目前页面还没上线. 微软目前已经正式推出 Windows 10 有两周,推出了三波累积更新.微软 Windows 10 现在采用的是“Windows 即服务”的模式,这意味着用户将看到频繁的修复和改进更新,而且很多系统组件和应用将

php大力力 [030节] php设计系统后台菜单

php大力力 [030节] php设计系统后台菜单 2015-0828 00:11开始设计: php大力力 [030节] php设计系统后台菜单 1.首先把所有后台页面都罗列出来: 2.需要增删改的页面,都用括号(+-△)标记出来: 3.开始尝试把不同页面分组,例如: 1.图书 1.a.... 1.b.... 1.c.... 2.人员 2.a.... 2.b.... 诸如此类排布一下 4.