文档章节

Android第四十一天

黄晓磊
 黄晓磊
发布于 2016/07/25 21:34
字数 1339
阅读 4
收藏 0
点赞 0
评论 0

 

1.概念

        <1>Android应用中的菜单默认是隐藏的,只有当用户点击手机上的MENU键,系统才会显示菜单。这种菜单叫做选项菜单(Option Menu)。

        <2>从3.0开始,Android不要求手机设备上必须提供MENU按键。因此Android推荐使用ActionBar来代替Menu。

2、分类

        <1>OptionsMenu 按手机menu弹出的菜单

                (1)重写public boolean onCreateOptionsMenu(menu)方法


// 显示弹出菜单布局必须要重写的方法,在这个地方加载菜单文件
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
setIconEnable(menu, true);
// 必须要返回true
return true;
}

                (2)创建菜单项MenuItem

                                a.创建菜单XML文件,必须以<menu>为根标签

                                        菜单XML的位置:/res/menu/

                                        <item>标签属性

                                                android:id表示item的id

                                                android:icon表示菜单的图标,4.0系统仅在ActionBar上显示图标

                                                android:title表示菜单的文字

                                        二级子菜单


<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/file"
android:title="@string/file" >
<!-- "file" 的子菜单 -->
<menu>
<item android:id="@+id/create_new"
android:title="@string/create_new" />
<item android:id="@+id/open"
android:title="@string/open" />
</menu>
</item>
</menu>

                                        二级组菜单


<item
android:id="@+id/menu_group2"
android:orderInCategory="1"
android:showAsAction="never"
android:title="文字颜色">
<menu >
<group>
<item android:id="@+id/font_red" android:title="red" />
<item android:id="@+id/font_green" android:title="green"></item>
<item android:id="@+id/font_blue" android:title="blue"></item>
<item android:id="@+id/font_yellow" android:title="yellow"></item>
</group>
</menu>
</item>

                                        二级可选组菜单


<item
android:id="@+id/menu_group1"
android:orderInCategory="1"
android:showAsAction="never"
android:title="文字尺寸">
<menu >

<!-- android:checkableBehavior 属性有三个可选值:all为多选,single为单选,none为不可选。为none时就是一个普通菜单 -->

<group android:checkableBehavior="single">
<item android:id="@+id/font_10" android:title="10sp"></item>
<item android:id="@+id/font_15" android:title="15sp"></item>
<item android:id="@+id/font_20" android:title="20sp"></item>
<item android:id="@+id/font_25" android:title="25sp"></item>
<item android:id="@+id/font_30" android:title="30sp"></item>
</group>
</menu>
</item>

                                        通过MenuInflater.inflater(int menuId,menu)方法将菜单项追加到菜单中

                                b.menu.add()方法增加菜单

                                        menu.add()方法返回MenuItem对象

                                                setIcon (int iconRes)

                                                setTitle (CharSequence title)

                                                setOnMenuItemClickListener(OnMenuItemClickListener)

                                                setIntent(Intent)设置点击菜单项时打开的窗口

                                        menu.add(CharSequence) :一般使用方法,增加菜单名称

                                        menu.add(0, 1, 1, "拍照")

                                                第一个参数为GroupID,Group即将菜单项分组

                                                第二个参数为ItemID,指的是菜单项的id

                                                第三个参数为order,指定菜单项的位置顺序

                                                第四个参数为title,指的是菜单项所显示的文字

                (3)重写public boolean onOptionsItemSelected(MenuItem item)方法,实现菜单项的选择事件


// 要做弹出菜单的点击事件必须重写的方法
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// 获取被点击的菜单的id
int id = item.getItemId();
switch (id) {
case R.id.item2:
Toast.makeText(this, "清除"+item.getTitle(), Toast.LENGTH_SHORT).show();
break;
case R.id.item3:
Toast.makeText(this, "杀毒"+item.getTitle(), Toast.LENGTH_SHORT).show();
break;
case R.id.item4:
Toast.makeText(this, "拨号"+item.getTitle(), Toast.LENGTH_SHORT).show();
break;

default:
break;
}
return super.onOptionsItemSelected(item);
}

        <2>ContextMenu 长按绑定UI控件的上下文菜单(上下文菜单继承自android.view.Menu)

                (1)上下文菜单与Options Menu最大的不同在于:

                                Options Menu的拥有者是Activity,而上下文菜单的拥有者是Activity中的View;

每个Activity最多只有一个Options Menu,它为整个Activity服务。而一个Activity往往有多个View,哪个View需要上下文菜单就通过registerForContextMenu(View view)给这个View注册上下文菜单。

                (2)生成上下文菜单是通过Activity中的onCreateContextMenu()方法:

                                onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo)方法很像生成Options Menu的onCreateOptionsMenu(Menu menu)方法;

两者的不同在于:onCreateOptionsMenu只在用户第一次按“Menu”键时被调用,而onCreateContextMenu会在用户每一次长按注册了上下文菜单的View时被调用。

                (3)ContextMenuInfo 有什么用呢?

                                当视图元素需要向上下文菜单传递一些信息,比如该View对应DB记录的id等,这就要使用ContextMenuInfo。需要传递额外信息的View需要重写getContextMenuInfo()方法,返回一个带有数据的ContextMenuInfo实现类对象。

                                ContextMenuInfo携带了注册上下文菜单控件的一些额外信息。一般用在AdaterViews(例如:Spinner 、ListView或GridView)上,可以在ContextMenuInfo 中获取到适配器View中的position的信息。

                (4)开发上下文菜单的步骤:

                                重写onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo)方法;

                                调用Activity的registerForContextMenu(View view)方法为view组件注册上下文菜单;(注册上下文菜单后,意味着用户长按该控件后显示上下文菜单)。

                                        创建菜单xml文件,必须以<menu>为根标签

                                        menu.setHeaderTitle(String) 设置窗口头的标题

                                        menu.setHeaderIcon(R.drawable.face) 设置窗口头的图标

                                为菜单项提供响应,重写onContextItemSelected(MenuItem item)。

                                Activity.registerForContextMenu(需要显示ContextMenu的控件)

        <3>PopupMenu  在指定UI控件的下方或上方显示的弹出菜单

                (1)PopupMenu(Context context, View anchor): 第二个参数是指弹出菜单显示的哪一个控件的下方或上方

                (2)MenuInflater.inflate(int menuResId,PopupMenu.getMenu()) 加载菜单资源到弹出菜单对象中

                (3)setOnMenuItemClickListener() 设置弹出菜单项的点击事件

                (4)show() 弹出菜单

                (5)dismiss() 关闭菜单

        <4>解决菜单项不显示图标的问题

 

//enable为true时,菜单添加图标有效,enable为false时无效。
private void setIconEnable(Menu menu, boolean enable)
{
try
{
Class<?> clazz = Class.forName("com.android.internal.view.menu.MenuBuilder");
Method m = clazz.getDeclaredMethod("setOptionalIconsVisible", boolean.class);
m.setAccessible(true);

//MenuBuilder实现Menu接口,创建菜单时,传进来的menu其实就是MenuBuilder对象(java的多态特征)
m.invoke(menu, enable);

} catch (Exception e)
{
e.printStackTrace();
}
}
  1.  

© 著作权归作者所有

共有 人打赏支持
黄晓磊
粉丝 21
博文 51
码字总数 45039
作品 0
成都
Android第三十一天

1、什么是Android的四层体系架构? <1>系统核心层(Linux Kernel) Android系统是基于Linux内核的,这一层为Android设备的各种硬件提供了底层的驱动,如显示驱动、音频驱动、照相机驱动、蓝牙...

黄晓磊 ⋅ 2016/07/11 ⋅ 0

Android第四十一天(2)

1、对话框的分类 <1>AlertDialog 警告对话框(提示对话框) (1)父类:android.app.Dialog (2)创建AlertDialog对话框的步骤 a.创建AlertDialog.Builder对象,该对象能创建AlertDialog; ...

黄晓磊 ⋅ 2016/07/25 ⋅ 0

Android第四十一天(3)

1、NotificationManager类对象 <1>getSystemService(Context.NOTIFICATION_SERVICE) 获取通知管理对象 <2>notify(int id, Notification notification) //定义通知管理对象 //定义通知构造器......

黄晓磊 ⋅ 2016/07/25 ⋅ 0

Android第二十一天

一:TCP/IP协议 TCP/IP是一个协议族。 TCP:(Transmission Control Protocol)传输控制协议 IP:(Internet Protocol)互联网协议 四层网络体系结构:物理层(网络接口层)、互联网络层(包含I...

黄晓磊 ⋅ 2016/06/27 ⋅ 0

Android模拟器如何异型屏

前言 Android Studio 3.1 稳定版已发布,重点围绕产品质量和应用开发效率进行改进。 详细请看Android Studio 3.1新特性介绍 由于我是那种爱折腾的人,第一眼看见的不是D8不是Kotlin Lint 检查...

no白菜 ⋅ 04/13 ⋅ 0

React Native 【学习总结】-【Jenkins集成】

简述 Jenkins是一个持续集成工具,它本身有很丰富的插件提供使用,方便持续集成,为开发省时省力,下面是项目中对新的RN项目做的持续集成例子,通过该例子学会如何使用jenkins。 Jenkins安装...

Pape ⋅ 05/18 ⋅ 0

Android插件化开发之动态加载技术学习

Android插件化开发之动态加载技术学习 为什么要插件化开发和动态加载呢?我认为原因有三点: 可以实现解耦 可以解除单个dex函数不能超过65535的限制 可以给apk瘦身,比如说360安全卫士,整个...

幸运券发放 ⋅ 05/18 ⋅ 0

Unity发布Android版本

先大概说一下我自己的经历吧,总的大概用了10小时吧。刚开始装的是jre和Android stdio,然后发现要装的是JDK和SDK,然后去装JDK和SDK,装JDK很顺利,装SDK失败了,原因未知。后面是用 Androi...

a_clear_chen ⋅ 05/08 ⋅ 0

浅入浅出 Android 安全:第四章 Android 框架层安全

第四章 Android 框架层安全 来源:Yury Zhauniarovich | Publications 译者:飞龙 协议:CC BY-NC-SA 4.0 如我们在第1.2节中所描述的那样,应用程序框架级别上的安全性由 IPC 引用监视器实现...

apachecn_飞龙 ⋅ 2016/12/05 ⋅ 0

PPT学习31_图形设计初级(7)

大家好,欢迎和我一起学习PPT小知识,今天是第三十一天,我最喜欢的大月日,选择在这一天作为暂时的告别日,希望短暂的分别后我们都可以对PPT有个更深入的了解。 和大家从零到设计,我有一个...

徐胥 ⋅ 2017/06/14 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

对于程序员的招聘问题,作为软件人的一些吐槽和建议

作为软件人,找工作有时候似乎挺苦逼的。 说真的,让我去掉前面这句中“似乎”二字吧。就是苦逼!很多人都曾抱怨处在招聘的一方很糟糕——我们没有任何可靠的方式来甄别会写代码并且写得好的...

老道士 ⋅ 28分钟前 ⋅ 0

HDFS原理学习

一、概述 1、 Hadoop整合了众多的文件系统,首先提供了一个高层的文件系统抽象org.apache.hadoop.fs.FileSystem。然后有各个文件系统的实现类。 2、Hadoop是JAVA编写的,不同文件系统之间的交...

cjxcloud ⋅ 31分钟前 ⋅ 0

Linux下MySQL表名不区分大小写的设置方法(抄袭别人的)

Linux下MySQL表名不区分大小写的设置方法 MySQL表名不区分大小写的设置方法 在用centox安装mysql后,把项目的数据库移植了过去,发现一些表的数据查不到,排查了一下问题,最后发现是表名的大...

随风而浮沉 ⋅ 36分钟前 ⋅ 0

ubuntu下安装宋体simsun

sudo cp simsun.ttc /usr/share/fonts cd /usr/share/fonts sudo chmod 644 simsun.ttc 更新字体缓存: 代码: sudo mkfontscale 代码: sudo mkfontdir 代码: sudo fc-cache -fsv 安装chrome扩......

wangxuwei ⋅ 38分钟前 ⋅ 0

利用 ssh 传输文件

Linux 下一般可以用 scp 命令通过 ssh 传送文件: #把服务器上的 /home/user/a.txt 发送到本机的 /var/www/local_dir 目录下scp username@servername:/home/user/a.txt /var/www/local_dir...

大灰狼时间 ⋅ 48分钟前 ⋅ 0

web3j教程:android和java程序员如何使用web3j开发区块链以太坊

如何使用web3j为Java应用或Android App增加以太坊区块链支持,本教程内容即涉及以太坊中的核心概念,例如账户管理包括账户的创建、钱包创建、交易转账,交易与状态、智能合约开发与交互、过滤...

智能合约 ⋅ 今天 ⋅ 0

web3j开发java或android以太坊智能合约快速入门

web3j简介 web3j是一个轻量级、高度模块化、响应式、类型安全的Java和Android类库提供丰富API,用于处理以太坊智能合约及与以太坊网络上的客户端(节点)进行集成。 可以通过它进行以太坊区块链...

笔阁 ⋅ 今天 ⋅ 0

一起读书《深入浅出nodejs》-异步I/O

异步I/O “异步”这个名词其实很早就诞生了,但它大规模流行却是在Web 2.0浪潮中,它伴随着AJAX的第一个A(Asynchronous)席卷了Web。 为什么要异步I/O 关于异步I/O为何在Node里如此重要,这与...

小草先森 ⋅ 今天 ⋅ 0

JVM各种问题

1、如果启动什么都不设,会怎样? 先来看一个命令 [root@localhost bin]# java -XX:+PrintCommandLineFlags -version -XX:InitialHeapSize=29899008 -XX:MaxHeapSize=478384128 -XX:+PrintCo......

算法之名 ⋅ 今天 ⋅ 0

SAS笔记-宏2

宏是一种文本,一般来说其编译是在程序执行之前。 宏变量的创建 %let语句 %let macro_variables = text; %let是常见的宏变量建立方式,其编译就在执行前。如下例中,想要宏变量test等于数据集...

tonorth123 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部