Android菜单项内容大全
一、介绍:
菜单是许多应用中常见的用户界面组件。
Android3.0版本以前,Android设备会提供一个专用“菜单”按钮呈现常用的一些用户操作,
Android3.0版本以后,取而代之的是提供一个操作栏来完成“菜单”的功能
关于菜单的官方介绍:<https://developer.android.com/guide/topics/ui/menus.html>
二、分类:
1、OptionsMenu(选项菜单)
Android 2.3.X或更低版本 Android3.0及更高版本
Android 2.3.X或更低版本,当用户按“菜单”按钮(实体按钮)时,选项菜单的内容会出现在屏幕底部;
Android3.0及更高版本,则选项菜单中的项目将出现在操作栏中。默认情况下,系统会将所有项目均放入操作溢出菜单中。用户可以使用操作栏右侧的操作溢出菜单图标(或者,通过按设备“菜单”按钮(如有))显
示操作溢出菜单。但是可以通过在tem中android:showAsAction = “ifRoom”将菜单选项直接提升到操作栏中去显示。
*:并不是所有的app都会有菜单出现在操作栏中的,这取决于app的设计,如果app是需要自己的操作栏,那么根据自己的需求设计,如果是系统默认的操作栏,那么就会有菜单。
---通过重写 onCreateOptionsMenu()创建选项菜单,您可以将菜单资源(使用 XML 定义)扩充到回调中提供的 Menu 中:
Eg:
- public boolean onCreateOptionsMenu(Menu menu) {
- getMenuInflater().inflate(R.menu.main, menu);
- //add新增菜单
- menu.add("新增选项菜单");
- //效果一样,都直接加的一级菜单
- menu.addSubMenu("新增选项菜单子菜单");
- //查询修改属性
- menu.findItem(R.id.action_settings).setTitle("设置");
- return true;
- }
---处理点击事件:用户从选项菜单中选择项目(包括操作栏中的操作项目)时,系统将调用 Activity 的 onOptionsItemSelected() 方法。此方法将传递所选的 MenuItem。您可以通过调用 getItemId() 方法来
识别项目,该方法将返回菜单项的唯一 ID,您可以将此 ID 与已知的菜单项匹配,以执行适当的操作。
Eg:
- public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case R.id.new_game:
- newGame();
- return true;
- case R.id.help:
- showHelp();
- return true;
- default:
- return super.onOptionsItemSelected(item);
- }
- }
2、ContextMenu(上下文菜单)
上下文菜单提供了许多操作,这些操作影响 UI 中的特定项目或上下文框架。您可以为任何视图提供上下文菜单,但这些菜单通常用于 ListView、GridView 或用户可直接操作每个项目的其他视图集合中的项目。
Android系统提供上下文操作的方法有2种:
(1)使用浮动上下文菜单
用户长按(按住)一个声明支持上下文菜单的视图时,菜单显示为菜单项的浮动列表(类似于对话框)。 用户一次可对一个项目执行上下文操作。比如:
创建浮动上下文菜单步骤:
1、通过调用 registerForContextMenu(),绑定菜单给具体的view。如果view是listview或者gridview,那么菜单将绑定给所有item。
2、在 Activity 中实现 onCreateContextMenu() 方法。
当注册后的视图收到长按事件时,系统将调用您的 onCreateContextMenu() 方法。在此方法中,您通常可通过扩充菜单资源来定义菜单项。比如:
3、实现 onContextItemSelected()。用户选择菜单项时,系统将调用此方法,以便您能够执行适当的操作。 例如:
- public boolean onContextItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case R.id.context_menu_1:
- Toast.makeText(getApplicationContext(), "选择菜单1,你要做什么,自己做...", 0).show();
- return true;
- default:
- return super.onContextItemSelected(item);
- }
- }
(2) 使用上下文操作模式
将在屏幕顶部显示上下文操作栏,其中包括影响所选项的操作项目。当此模式处于活动状态时,用户可以同时对多项执行操作(如果应用允许)。比如:
创建上下文操作模式菜单步骤:
A:为单个视图启用上下文操作模式
1:实现ActionMode.Callback接口。在其回调方法中,您既可以为上下文操作栏指定操作,又可以响应操作项目的点击事件。
2:当需要显示操作栏时(例如,用户长按视图),调用startActionMode()。比如:
- private ActionMode.Callback mActionModeCallback = new ActionMode.Callback() {
- /**
- * onCreateActionMode()之后调用,返回false表示什么也不做。
- */
- @Override
- public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
- return false;
- }
- @Override
- public void onDestroyActionMode(ActionMode mode) {
- //方便内存回收
- actionMode = null;
- }
- /**
- * 当actionmode被创建,startActionMode()方法被调用,回调此方法
- * 在这里可以为上下文操作模式绑定菜单
- */
- @Override
- public boolean onCreateActionMode(ActionMode mode, Menu menu) {
- MenuInflater menuInflater = mode.getMenuInflater();
- menuInflater.inflate(R.menu.context_menu, menu);
- return true;
- }
- /**
- * 当actionMode绑定的上下文菜单被点击的时候的回调
- */
- @Override
- public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
- switch (item.getItemId()) {
- case R.id.context_menu_1:
- //选中菜单1,我就把button2的文字改一下好了..
- button2.setText(item.getTitle());
- //完成菜单的任务之后,最好销毁一下actionMode对象,不要长期占用内存
- actionMode.finish();
- return true;
- default:
- return false;
- }
- }
- };
B:在 ListView 或 GridView 中有一组项目(或 AbsListView 的其他扩展),且需要允许用户执行批处理操作。
步骤:
1:使用 setMultiChoiceModeListener()设置AbsListView.MultiChoiceModeListener 接口的实现类对象。
2:使用 setChoiceMode()设置选择模式为 CHOICE_MODE_MULTIPLE_MODAL;
- listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
Eg:
- lv = (ListView) findViewById(R.id.lv);
- strings = new ArrayList<String>();
- strings.add("item1");
- strings.add("item2");
- strings.add("item3");
- adapter = new ArrayAdapter<String>(this,
- android.R.layout.simple_list_item_1, strings);
- lv.setAdapter(adapter);
- // 设置上下文操作模式
- lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
- lv.setMultiChoiceModeListener(new MultiChoiceModeListener() {
- @Override
- public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
- return false;
- }
- @Override
- public void onDestroyActionMode(ActionMode mode) {
- }
- @Override
- public boolean onCreateActionMode(ActionMode mode, Menu menu) {
- MenuInflater menuInflater = mode.getMenuInflater();
- menuInflater.inflate(R.menu.context_menu, menu);
- return true;
- }
- @Override
- public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
- Log.v("zoubo", "onActionItemClicked..");
- switch (item.getItemId()) {
- case R.id.context_menu_1:
- // 选中菜单1,新增一个item
- strings.add("item4");
- adapter.notifyDataSetChanged();
- // 局部的mode,不需要维护其生命周期
- // mode.finish();
- return true;
- default:
- return false;
- }
- }
- /**
- * item选中状态发生改变时调用
- */
- @Override
- public void onItemCheckedStateChanged(ActionMode mode,
- int position, long id, boolean checked) {
- Log.v("zoubo", "onItemCheckedStateChanged..");
- }
- });
*:现在,当用户通过长按选择项目时,系统即会调用 onCreateActionMode() 方法,并显示包含指定操作的上下文操作栏。
在某些情况下,如果上下文操作提供常用的操作项目,则您可能需要添加一个复选框或类似的 UI 元素来支持用户选择项目,这是因为他们可能没有发现长按行为。
用户选中该复选框时,您可以通过使用 setItemChecked() 将相应的列表项设置为选中状态,以此调用上下文操作模式。
2、PopupMenu(弹出式菜单)
锚定到 View 的模态菜单。如果空间足够,它将显示在定位视图下方,否则显示在其上方。
一般会在如下场景使用到它:
与特定内容确切相关的操作提供溢出样式菜单,(例如,Gmail 的电子邮件标头)
提供命令语句的另一部分(例如,标记为“添加”且使用不同的“添加”选项生成弹出菜单的按钮)
提供类似于 Spinner 且不保留永久选择的下拉菜单。
Eg:
- ImageView iv1 = (ImageView) findViewById(R.id.iv1);
- iv1.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- PopupMenu popupMenu = new PopupMenu(MainActivity.this, v);
- MenuInflater menuInflater = popupMenu.getMenuInflater();
- menuInflater.inflate(R.menu.popup_menu, popupMenu.getMenu());
- popupMenu.show();
- popupMenu.setOnMenuItemClickListener(new OnMenuItemClickListener() {
- @Override
- public boolean onMenuItemClick(MenuItem item) {
- switch (item.getItemId()) {
- case R.id.popup_menu_1:
- return true;
- default:
- return false;
- }
- }
- });
- }
- });
PopupWindow:
PopupWidow提供实现自定义菜单的原生控件,它可以指定自己绘制的view对象作为弹出菜单锚定出现在view的周围,并且可以控制它具体出现的位置
Eg:
- Button btn3 = (Button) findViewById(R.id.btn3);
- btn3.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- View contentView = LayoutInflater.from(v.getContext()).inflate(
- R.layout.popup_menu, null);
- PopupWindow popupWindow = new PopupWindow(contentView,
- LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
- // 出现view的下方
- // popupWindow.showAsDropDown(v);
- // 如果不设置PopupWindow的背景,无论是点击外部区域还是Back键都无法dismiss弹框
- popupWindow.setBackgroundDrawable(getResources().getDrawable(R.drawable.q2));
- popupWindow.setOutsideTouchable(true);
- popupWindow.showAtLocation(v, Gravity.TOP, (int) v.getX(),(int) v.getY());
- }
- });
*:代码中,如果需要点击外部让popupwindow消失的话,必须调用这2句代码:
popupWindow.setBackgroundDrawable(getResources().getDrawable(R.drawable.q2));
popupWindow.setOutsideTouchable(true);
popupWindow遮罩效果的实现:
布局:
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/ll"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:background="#b0000000"
- android:orientation="vertical">
- final PopupWindow popupWindow = new PopupWindow(inflate, RelativeLayout.LayoutParams.MATCH_PARENT,
- RelativeLayout
- .LayoutParams.WRAP_CONTENT);
- //对于用户的可视范围之外的区域点击,让窗口消失的处理方式
- inflate.setOnTouchListener(new View.OnTouchListener() {
- public boolean onTouch(View v, MotionEvent event) {
- int height = inflate.findViewById(tv).getTop();
- int y = (int) event.getY();
- if (event.getAction() == MotionEvent.ACTION_UP) {
- if (y < height) {
- popupWindow.dismiss();
- }
- }
- return true;
- }
- });
Android菜单项内容大全的更多相关文章
- 实战android菜单项之XML加载菜单与动态菜单项[转]
原文地址:http://blog.csdn.net/kaiwii/article/details/7767225 自定义android应用程序的菜单项首先要知道切入点.经过学习,知道主要是两个Acti ...
- Android开发 ---代码创建选项菜单、隐藏菜单项、菜单的生命周期,菜单按钮图标设置、搜索框、xml中设置子菜单
1.activity_main.xml 描述: 定义了一个按钮 <?xml version="1.0" encoding="utf-8"?> < ...
- 【转】Android 菜单(OptionMenu)大全 建立你自己的菜单--不错
原文网址:http://www.cnblogs.com/salam/archive/2011/04/04/2005329.html 菜单是用户界面中最常见的元素之一,使用非常频繁,在Android中, ...
- Android 菜单(OptionMenu)大全 建立你自己的菜单
转自:http://www.cnblogs.com/salam/archive/2011/04/04/2005329.html 菜单是用户界面中最常见的元素之一,使用非常频繁,在Android中,菜单 ...
- Android Permission 访问权限大全(转)
程序执行需要读取到安全敏感项必需在androidmanifest.xml中声明相关权限请求, 完整列表如下: android.permission.ACCESS_CHECKIN_PROPERTIES允 ...
- Android菜单Menu的创建
在res目录下的menu文件夹下创建一个main.xml文件,内容如下: <?xml version="1.0" encoding="utf-8"?> ...
- 【转】Android菜单详解——理解android中的Menu--不错
原文网址:http://www.cnblogs.com/qingblog/archive/2012/06/08/2541709.html 前言 今天看了pro android 3中menu这一章,对A ...
- 简单的 Android 菜单
Android 创建简单的菜单 一:上下文菜单: 1.在 res 下创建菜单项资源文夹 menu app->右击res->new->android resourse director ...
- Android菜单(menu)
Android 菜单 我们继续来进行学习,今天写一下在软件中用的还算较多的菜单. 1.Menu 菜单,很显然,作用就是点击不同的选项触发不同的方法.现在在安卓使用中推荐使用ActionBar,但这里 ...
随机推荐
- 学习AOP之认识一下Spring AOP
心碎之事 要说知道AOP这个词倒是很久很久以前了,但是直到今天我也不敢说非常的理解它,其中的各种概念即抽象又太拗口. 在几次面试中都被问及AOP,但是真的没有答上来,或者都在面上,这给面试官的感觉就是 ...
- redux-undo
简介 通过包装reducer,创建一个state History,保留历史state,可以做退一步,进一步操作 1.install npm install --save redux-undo@beta ...
- .net 分布式架构之配置中心
开源QQ群: .net 开源基础服务 238543768 开源地址: http://git.oschina.net/chejiangyi/Dyd.BaseService.ConfigManager ...
- 【原】无脑操作:express + MySQL 实现CRUD
基于node.js的web开发框架express简单方便,很多项目中都在使用.这里结合MySQL数据库,实现最简单的CRUD操作. 开发环境: IDE:WebStorm DB:MySQL ------ ...
- 【从零开始学BPM,Day4】业务集成
[课程主题] 主题:5天,一起从零开始学习BPM [课程形式] 1.为期5天的短任务学习 2.每天观看一个视频,视频学习时间自由安排. [第四天课程] 1.课程概要 Step 1 软件下载:H3 BP ...
- Android中使用ViewFlipper实现屏幕页面切换(关于坐标轴的问题已补充更改)
屏幕切换指的是在同一个Activity内屏幕间的切换,ViewFlipper继承了Framelayout类,ViewAnimator类的作用是为FrameLayout里面的View切换提供动画效果.如 ...
- sqlServer去除字符串空格
说起去除字符串首尾空格大家肯定第一个想到trim()函数,不过在sqlserver中是没有这个函数的,却而代之的是ltrim()和rtrim()两个函数.看到名字所有人都 知道做什么用的了,ltrim ...
- Linux基础介绍【第三篇】
更改SSH服务端远程登录的配置 windows服务端的默认远程管理端口是3389,管理员用户是administrator,普通用户是guest.Linux的管理用户是root,普通用户默认有很多个,远 ...
- #ifndef
关于c的#ifndef条件编译: 1)最好把头文件的内容都放在#ifndef和#endif中 2)一般格式: #ifndef <标识> #define <标识> ...... ...
- 解决Windows 8.1中所有的应用(Modern App)无法打开(闪退)的问题
我已经在3台电脑上遇到这个问题了,症状是,所有应用商店安装的App都无法打开,包括应用商店本身,在开始界面点击应用以后,应用的Logo一闪而过,然后就消失了,回到了开始界面.查看系统应用日志,会有这样 ...