Android的上下文菜单和子菜单_至少存在一个控件注册了上下文菜单;-程序员宅基地

技术标签: 上下文菜单  contextmenu  SubMenu  子菜单  Android  

在博客standupTimer项目中选项菜单的应用中粗略的介绍了standupTimer项目的选项菜单,也就是把standupTimer项目中选项菜单相关的源码贴出来,并没有做任何的延伸。Android的菜单主要包括选项菜单(OptionsMenu),内容菜单(ContextMenu)和子菜单(SubMenu)三种菜单,这篇博客算是standupTimer项目中选项菜单的应用的延伸,主要总结下内容菜单和子菜单。

内容菜单(ContextMenu)又称为上下文菜单或者长按菜单,当用户长按住一个注册了上下文菜单的控件时,会弹出一个上下文菜单,它是一个流式的列表,供用户选择某项;内容菜单扩展自Menu,提供了修改上下文菜单头(header)的功能,上下文菜单不支持菜单项的快捷方式和图标,但是可以为上下文菜单设置图标。

  其实掌握了内容菜单的编程套路,内容菜单容器来也是蛮简单的,至少最基本的用法很容易就能掌握,下面把内容菜单的基本使用代码贴下来,代码包括两部分,一部分是为TextView控件增加内容菜单,另外一部分是为ListView控件增加内容菜单。

下面是为TextView控件增加内容菜单的代码:

首先要在布局的xml文件中增加一个TextView控件并实现实例化,还要为TextView控件注册上下文菜单:

protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.main);

	lv = (ListView) this.findViewById(R.id.lv);  
	this.registerForContextMenu(lv); 
}

然后实现函数onCreateContextMenu()创建上下文菜单,当长按TextView控件的时候,onCreateContextMenu()函数会被调用,函数中把定义好的xml文件直接填充进来,onCreateContextMenu()函数和xml文件如下:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:id="@+id/settings"
        android:alphabeticShortcut="s"
        android:icon="@android:drawable/ic_menu_preferences"
        android:title="@string/settings_label"/>
    <item
        android:id="@+id/teams"
        android:alphabeticShortcut="t"
        android:icon="@drawable/team"
        android:title="@string/team_label"/>
    <item
        android:id="@+id/about"
        android:alphabeticShortcut="a"
        android:icon="@android:drawable/ic_menu_info_details"
        android:title="@string/about_label"/>
    <item
        android:id="@+id/help"
        android:alphabeticShortcut="h"
        android:icon="@android:drawable/ic_menu_help"
        android:title="@string/help_label"/>

</menu>

public void onCreateContextMenu(ContextMenu menu, View v,  ContextMenuInfo menuInfo) {  
	super.onCreateContextMenu(menu, v, menuInfo);  

	MenuInflater inflater = getMenuInflater();
	inflater.inflate(R.menu.menu, menu);
}

以上是静态方式实现上下文菜单,还可以在onCreateContextMenu()函数中动态的实现上下文菜单,一个简单的实现代码如下:

public void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) {
	super.onCreateContextMenu(menu, v, menuInfo);
	menu.setHeaderTitle("Title");
	menu.setHeaderIcon(R.drawable.team);
	menu.add(0, 0, 0, "复制");
	menu.add(0, 1, 0, "剪贴");
	menu.add(0, 2, 0, "重命名");
}
最后添加菜单选择监听事件,也就是覆盖函数onContextItemSelected(),当上下文菜单被选择的时候,该函数会被调用:
public boolean onContextItemSelected (MenuItem item) {  
        switch (item.getItemId()) {  
        case R.id.about:  
            Logger.d("Displaying the about box");  
            displayAboutBox();  
            return true;  
        case R.id.help:  
            Logger.d("Displaying the help dialog");  
            displayHelpDialog();  
            return true;  
        case R.id.settings:  
            Logger.d("Displaying the settings");  
            displaySettings();  
            return true;  
        case R.id.teams:  
            Logger.d("Displaying the team configuration");  
            displayTeamConfiguration();  
            return true;  
        default:  
            Logger.e("Unknown menu item selected");  
            return false;  
        }  
    }
下面是为ListView控件实现上下文菜单代码:
和TextView类似,首先要在布局的xml文件中增加一个ListView控件并实现实例化,还要为ListView控件注册上下文菜单:

protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.main);

lv = (ListView) this.findViewById(R.id.lv);
this.registerForContextMenu(lv);
initListView();//对ListView进行初始化,也就是设置适配器adapter;

private void initListView() {
	menuStrs = new String[] { "TEST1", "TEST2", "TEST3", "TEST4" };
	adapter = new ArrayAdapter<String>(this,
			android.R.layout.simple_list_item_1, menuStrs);
	lv.setAdapter(adapter);
}

然后实现函数onCreateContextMenu()创建上下文菜单,当长按ListView控件中的一个选项的时候,onCreateContextMenu()函数会被调用,函数中把定义好的xml文件直接填充进来,xml文件同在上面定义的,onCreateContextMenu()函数和如下:

public void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) {
	super.onCreateContextMenu(menu, v, menuInfo);
	MenuInflater inflater = getMenuInflater();
	inflater.inflate(R.menu.menu, menu);
}

最后添加菜单选择监听事件,也就是覆盖函数onContextItemSelected (),当上下文菜单被选择的时候,该函数会被调用:

public boolean onContextItemSelected(MenuItem item) {
	AdapterContextMenuInfo menuInfo = (AdapterContextMenuInfo) item.getMenuInfo();
	switch (item.getItemId()) {
	case R.id.about:
			menuStrs[menuInfo.position] += "about";
			displayAboutBox();
			return true;
		case R.id.help:
			menuStrs[menuInfo.position] += "help";
			displayHelpDialog();
			return true;
		case R.id.settings:
			menuStrs[menuInfo.position] += "settings";
			displaySettings();
			return true;
		case R.id.teams:
			menuStrs[menuInfo.position] += "teams";
			displayTeamConfiguration();
			return true;
		default:
			menuStrs[menuInfo.position] += "Unknown menu item selected";
			return false;
		}
	adapter.notifyDataSetChanged();
	return true;
}

从上面可以看出实现为控件增加上下文菜单。总的来说也主要分为三部:

第一步:覆盖onCreateContextMenu()方法,或者静态或者动态的创建上下文菜单;

第二部:覆盖onOptionsItemSelected()方法,为上下文菜单实现监听函数;

第三部:为控件注册上下文菜单,这里的注册函数registerForContextMenu()是将控件和上下文菜单联系起来的桥梁;

  子菜单和选项菜单比较类似,它的特点是可以将菜单进行分组,更方面用户进行选择和操作,其实无论是选项菜单,子菜单还是上下文菜单,创建方式都有两种,一种是使用xml文件静态创建,另外一种是使用动态方式创建,子菜单的示例使用静态方式进行创建,动态创建需要的时候再自己搜索下就OK了。

子菜单的应用和选项菜单的应用基本上是相同的,就静态创建菜单方式而言,子菜单和选项菜单xml是不同的,所要覆盖的函数完全相同。

使用子菜单的示例代码如下:

首先创建xml文件,供onCreateOptionsMenu()调用的时候加载,xml文件定义如下:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:id="@+id/file"
        android:orderInCategory="100"
        android:showAsAction="never"
        android:title="文件操作">
        <menu>
            <item
                android:id="@+id/new_file"
                android:showAsAction="never"
                android:title="新建"/>
            <item
                android:id="@+id/open_file"
                android:showAsAction="never"
                android:title="打开"/>
            <item
                android:id="@+id/edit_file"
                android:showAsAction="never"
                android:title="编辑"/>
        </menu>
    </item>
    <item
        android:id="@+id/set"
        android:orderInCategory="100"
        android:showAsAction="never"
        android:title="设置">
        <menu>
            <item
                android:id="@+id/delete_set"
                android:showAsAction="never"
                android:title="删除"/>
            <item
                android:id="@+id/exit_set"
                android:showAsAction="never"
                android:title="退出"/>
        </menu>
    </item>

</menu>

加载函数为:

public boolean onCreateOptionsMenu(Menumenu) {
         getMenuInflater().inflate(R.menu.menu,menu);
         return true;
}
菜单选择事件监听函数为:
public boolean onOptionsItemSelected(MenuItem item) {//菜单选择事件监听
	switch (item.getItemId()){
		case R.id.new_file:
			Toast.makeText(this,"您选择了新建按钮",Toast.LENGTH_SHORT).show();
			break;
		case R.id.open_file:
			Toast.makeText(this,"您选择了打开按钮",Toast.LENGTH_SHORT).show();
			break;
		case R.id.edit_file:
			Toast.makeText(this,"您选择了编辑按钮",Toast.LENGTH_SHORT).show();
			break;
		case R.id.delete_set:
			Toast.makeText(this,"您选择了删除按钮",Toast.LENGTH_SHORT).show();
			break;
		case R.id.exit_set:
			Toast.makeText(this,"您选择了退出按钮",Toast.LENGTH_SHORT).show();
			break;
	}
	return super.onOptionsItemSelected(item);
}
另外,除了以上两个函数外,菜单中比较常用的另外两个函数为:
boolean onMenuOpened(int featureId, Menu menu):菜单打开时被调用;
void onOptionsMenuClosed(Menu menu):菜单关闭的时候被调用;

参考网址:
http://blog.csdn.net/u012702547/article/details/49448031
http://wiki.jikexueyuan.com/project/twenty-four-Scriptures/android-sub-menu.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Ken86/article/details/51972326

智能推荐

攻防世界_难度8_happy_puzzle_攻防世界困难模式攻略图文-程序员宅基地

文章浏览阅读645次。这个肯定是末尾的IDAT了,因为IDAT必须要满了才会开始一下个IDAT,这个明显就是末尾的IDAT了。,对应下面的create_head()代码。,对应下面的create_tail()代码。不要考虑爆破,我已经试了一下,太多情况了。题目来源:UNCTF。_攻防世界困难模式攻略图文

达梦数据库的导出(备份)、导入_达梦数据库导入导出-程序员宅基地

文章浏览阅读2.9k次,点赞3次,收藏10次。偶尔会用到,记录、分享。1. 数据库导出1.1 切换到dmdba用户su - dmdba1.2 进入达梦数据库安装路径的bin目录,执行导库操作  导出语句:./dexp cwy_init/[email protected]:5236 file=cwy_init.dmp log=cwy_init_exp.log 注释:   cwy_init/init_123..._达梦数据库导入导出

js引入kindeditor富文本编辑器的使用_kindeditor.js-程序员宅基地

文章浏览阅读1.9k次。1. 在官网上下载KindEditor文件,可以删掉不需要要到的jsp,asp,asp.net和php文件夹。接着把文件夹放到项目文件目录下。2. 修改html文件,在页面引入js文件:<script type="text/javascript" src="./kindeditor/kindeditor-all.js"></script><script type="text/javascript" src="./kindeditor/lang/zh-CN.js"_kindeditor.js

STM32学习过程记录11——基于STM32G431CBU6硬件SPI+DMA的高效WS2812B控制方法-程序员宅基地

文章浏览阅读2.3k次,点赞6次,收藏14次。SPI的详情简介不必赘述。假设我们通过SPI发送0xAA,我们的数据线就会变为10101010,通过修改不同的内容,即可修改SPI中0和1的持续时间。比如0xF0即为前半周期为高电平,后半周期为低电平的状态。在SPI的通信模式中,CPHA配置会影响该实验,下图展示了不同采样位置的SPI时序图[1]。CPOL = 0,CPHA = 1:CLK空闲状态 = 低电平,数据在下降沿采样,并在上升沿移出CPOL = 0,CPHA = 0:CLK空闲状态 = 低电平,数据在上升沿采样,并在下降沿移出。_stm32g431cbu6

计算机网络-数据链路层_接收方收到链路层数据后,使用crc检验后,余数为0,说明链路层的传输时可靠传输-程序员宅基地

文章浏览阅读1.2k次,点赞2次,收藏8次。数据链路层习题自测问题1.数据链路(即逻辑链路)与链路(即物理链路)有何区别?“电路接通了”与”数据链路接通了”的区别何在?2.数据链路层中的链路控制包括哪些功能?试讨论数据链路层做成可靠的链路层有哪些优点和缺点。3.网络适配器的作用是什么?网络适配器工作在哪一层?4.数据链路层的三个基本问题(帧定界、透明传输和差错检测)为什么都必须加以解决?5.如果在数据链路层不进行帧定界,会发生什么问题?6.PPP协议的主要特点是什么?为什么PPP不使用帧的编号?PPP适用于什么情况?为什么PPP协议不_接收方收到链路层数据后,使用crc检验后,余数为0,说明链路层的传输时可靠传输

软件测试工程师移民加拿大_无证移民,未受过软件工程师的教育(第1部分)-程序员宅基地

文章浏览阅读587次。软件测试工程师移民加拿大 无证移民,未受过软件工程师的教育(第1部分) (Undocumented Immigrant With No Education to Software Engineer(Part 1))Before I start, I want you to please bear with me on the way I write, I have very little gen...

随便推点

Thinkpad X250 secure boot failed 启动失败问题解决_安装完系统提示secureboot failure-程序员宅基地

文章浏览阅读304次。Thinkpad X250笔记本电脑,装的是FreeBSD,进入BIOS修改虚拟化配置(其后可能是误设置了安全开机),保存退出后系统无法启动,显示:secure boot failed ,把自己惊出一身冷汗,因为这台笔记本刚好还没开始做备份.....根据错误提示,到bios里面去找相关配置,在Security里面找到了Secure Boot选项,发现果然被设置为Enabled,将其修改为Disabled ,再开机,终于正常启动了。_安装完系统提示secureboot failure

C++如何做字符串分割(5种方法)_c++ 字符串分割-程序员宅基地

文章浏览阅读10w+次,点赞93次,收藏352次。1、用strtok函数进行字符串分割原型: char *strtok(char *str, const char *delim);功能:分解字符串为一组字符串。参数说明:str为要分解的字符串,delim为分隔符字符串。返回值:从str开头开始的一个个被分割的串。当没有被分割的串时则返回NULL。其它:strtok函数线程不安全,可以使用strtok_r替代。示例://借助strtok实现split#include <string.h>#include <stdio.h&_c++ 字符串分割

2013第四届蓝桥杯 C/C++本科A组 真题答案解析_2013年第四届c a组蓝桥杯省赛真题解答-程序员宅基地

文章浏览阅读2.3k次。1 .高斯日记 大数学家高斯有个好习惯:无论如何都要记日记。他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢?高斯出生于:1777年4月30日。在高斯发现的一个重要定理的日记_2013年第四届c a组蓝桥杯省赛真题解答

基于供需算法优化的核极限学习机(KELM)分类算法-程序员宅基地

文章浏览阅读851次,点赞17次,收藏22次。摘要:本文利用供需算法对核极限学习机(KELM)进行优化,并用于分类。

metasploitable2渗透测试_metasploitable2怎么进入-程序员宅基地

文章浏览阅读1.1k次。一、系统弱密码登录1、在kali上执行命令行telnet 192.168.26.1292、Login和password都输入msfadmin3、登录成功,进入系统4、测试如下:二、MySQL弱密码登录:1、在kali上执行mysql –h 192.168.26.129 –u root2、登录成功,进入MySQL系统3、测试效果:三、PostgreSQL弱密码登录1、在Kali上执行psql -h 192.168.26.129 –U post..._metasploitable2怎么进入

Python学习之路:从入门到精通的指南_python人工智能开发从入门到精通pdf-程序员宅基地

文章浏览阅读257次。本文将为初学者提供Python学习的详细指南,从Python的历史、基础语法和数据类型到面向对象编程、模块和库的使用。通过本文,您将能够掌握Python编程的核心概念,为今后的编程学习和实践打下坚实基础。_python人工智能开发从入门到精通pdf

推荐文章

热门文章

相关标签