onCreateOptionsMenu只会在启动时调用一次,而onCreateContextMenu则每次都会调用,这是因为onCreateContextMenu需要为所有的View控件的上下文菜单服务,可能会在存在多个控件都绑定了上下文的情况,针对每个控件的上下文菜单事件都需要即时处理,但Android设计应该有个可以持久化的方案,从而避免每次都需要重新加载菜单项。

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" > <TextView
android:id="@+id/txt"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="可通过上下文菜单修改背景色"
android:textSize="15pt" /> <TextView
android:id="@+id/txt2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="可通过上下文菜单修改前景色"
android:textSize="15pt" /> </LinearLayout>

my_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:title="@string/font_size"
android:icon="@drawable/font">
<menu>
<!-- 定义一组单选菜单项 -->
<group android:checkableBehavior="single">
<!-- 定义多个菜单项 -->
<item
android:id="@+id/font_10"
android:title="@string/font_10"/>
<item
android:id="@+id/font_12"
android:title="@string/font_12"/>
<item
android:id="@+id/font_14"
android:title="@string/font_14"/>
<item
android:id="@+id/font_16"
android:title="@string/font_16"/>
<item
android:id="@+id/font_18"
android:title="@string/font_18"/>
</group>
</menu>
</item>
<!-- 定义一个普通菜单项 -->
<item android:id="@+id/plain_item"
android:title="@string/plain_item">
</item>
<item android:title="@string/font_color"
android:icon="@drawable/color">
<menu>
<!-- 定义一组允许复选的菜单项 -->
<group>
<!-- 定义3个菜单项 -->
<item
android:id="@+id/red_font"
android:title="@string/red_title"/>
<item
android:id="@+id/green_font"
android:title="@string/green_title"/>
<item
android:id="@+id/blue_font"
android:title="@string/blue_title"/>
</group>
</menu>
</item>
</menu>

context.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 定义一组单选菜单项目 -->
<group android:checkableBehavior="single">
<!-- 定义3个菜单项 -->
<item
android:id="@+id/red"
android:title="@string/red_title"
android:alphabeticShortcut="r"/>
<item
android:id="@+id/green"
android:title="@string/green_title"
android:alphabeticShortcut="g"/>
<item
android:id="@+id/blue"
android:title="@string/blue_title"
android:alphabeticShortcut="b"/>
</group>
</menu>

context2.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 定义一组单选菜单项目 -->
<group android:checkableBehavior="single">
<!-- 定义3个菜单项 -->
<item
android:id="@+id/white"
android:title="@string/white_title"
android:alphabeticShortcut="r"/>
<item
android:id="@+id/black"
android:title="@string/black_title"
android:alphabeticShortcut="g"/>
<item
android:id="@+id/gray"
android:title="@string/gray_title"
android:alphabeticShortcut="b"/>
</group>
</menu>

strings.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello World, MenuResTest!</string>
<string name="app_name">使用XML资源文件定义菜单</string>
<string name="red_title">红色</string>
<string name="blue_title">蓝色</string>
<string name="green_title">绿色</string>
<string name="white_title">白色</string>
<string name="black_title">黑色</string>
<string name="gray_title">灰色</string>
<string name="font_size">字体大小</string>
<string name="font_color">字体颜色</string>
<string name="plain_item">普通菜单项</string>
<string name="font_10">10号字体</string>
<string name="font_12">12号字体</string>
<string name="font_14">14号字体</string>
<string name="font_16">16号字体</string>
<string name="font_18">18号字体</string>
</resources>

MenuResText.java

package org.crazyit.ui;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast; /**
* Description: <br/>
* site: <a href="http://www.crazyit.org">crazyit.org</a> <br/>
* Copyright (C), 2001-2014, Yeeku.H.Lee <br/>
* This program is protected by copyright laws. <br/>
* Program Name: <br/>
* Date:
*
* @author Yeeku.H.Lee kongyeeku@163.com
* @version 1.0
*/
public class MenuResTest extends Activity {
private TextView txt,txt2; @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
txt = (TextView) findViewById(R.id.txt);
txt2 = (TextView) findViewById(R.id.txt2);
// 为文本框注册上下文菜单
registerForContextMenu(txt);
registerForContextMenu(txt2);
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflator = new MenuInflater(this);
// 状态R.menu.context对应的菜单,并添加到menu中
inflator.inflate(R.menu.my_menu, menu);
return super.onCreateOptionsMenu(menu);
} int selectedIndex1 = -1;
int selectedIndex2 = -1; // 创建上下文菜单时触发该方法
@Override
public void onCreateContextMenu(ContextMenu menu, View source,
ContextMenu.ContextMenuInfo menuInfo) {
int vId = source.getId();
MenuInflater inflator = new MenuInflater(this);
if (vId == R.id.txt) {
// 状态R.menu.context对应的菜单,并添加到menu中
inflator.inflate(R.menu.context, menu);
menu.setHeaderIcon(R.drawable.tools);
menu.setHeaderTitle("请选择背景色");
if (selectedIndex1 >= 0) {
menu.getItem(selectedIndex1).setChecked(true);
}
}
else if(vId == R.id.txt2)
{
// 状态R.menu.context对应的菜单,并添加到menu中
inflator.inflate(R.menu.context2, menu);
menu.setHeaderTitle("请选择前景色");
if (selectedIndex2 >= 0) {
menu.getItem(selectedIndex2).setChecked(true);
}
}
} // 上下文菜单中菜单项被单击时触发该方法。
@Override
public boolean onContextItemSelected(MenuItem mi) {
switch (mi.getItemId()) {
case R.id.red:
selectedIndex1 = 0;
txt.setBackgroundColor(Color.RED);
break;
case R.id.green:
selectedIndex1 = 1;
txt.setBackgroundColor(Color.GREEN);
break;
case R.id.blue:
selectedIndex1 = 2;
txt.setBackgroundColor(Color.BLUE);
break;
case R.id.white:
selectedIndex2 = 0;
txt2.setTextColor(Color.WHITE);
break;
case R.id.black:
selectedIndex2 = 1;
txt2.setTextColor(Color.BLACK);
break;
case R.id.gray:
selectedIndex2 = 2;
txt2.setTextColor(Color.GRAY);
break;
}
return true;
} @Override
// 选项菜单的菜单项被单击后的回调方法
public boolean onOptionsItemSelected(MenuItem mi) {
if (mi.isCheckable()) {
mi.setChecked(true); // ②
}
// 判断单击的是哪个菜单项,并针对性的作出响应。
switch (mi.getItemId()) {
case R.id.font_10:
txt.setTextSize(10 * 2);
break;
case R.id.font_12:
txt.setTextSize(12 * 2);
break;
case R.id.font_14:
txt.setTextSize(14 * 2);
break;
case R.id.font_16:
txt.setTextSize(16 * 2);
break;
case R.id.font_18:
txt.setTextSize(18 * 2);
break;
case R.id.red_font:
txt.setTextColor(Color.RED);
mi.setChecked(true);
break;
case R.id.green_font:
txt.setTextColor(Color.GREEN);
mi.setChecked(true);
break;
case R.id.blue_font:
txt.setTextColor(Color.BLUE);
mi.setChecked(true);
break;
case R.id.plain_item:
Toast toast = Toast.makeText(MenuResTest.this, "您单击了普通菜单项",
Toast.LENGTH_SHORT);
toast.show();
break;
}
return true;
}
}

截图:

onCreateOptionsMenu与onCreateContextMenu差别的更多相关文章

  1. Android4.0 -- UI控件之 Menu 菜单的的使用(二)

    上一讲我们讲解了android中在代码或者xml文件中定义菜单,这一讲我们继续来讲解一下定义菜单的其他方式:创建上下文的菜单.查看API文档 Menus :Creating Contextual Me ...

  2. 使用XML文件定义菜单

    Android提供了两种创建菜单的方式,一种是在Java代码中创建,一种使用XML资源文件定义.上面的实例都是在Java代码中创建菜单,在Java代码中创建菜单存在如下不足. 在Java代码中定义菜单 ...

  3. Android之控件与布局,结构知识点,基础完结

    版权声明:未经博主允许不得转载 在Android中我们常常用到很多UI控件,如TextView,EditText,ImageView,Button,ImageButton,ToggleButton,C ...

  4. onCreateOptionsMenu

    onCreateOptionsMenu----只在Activity创建时调用一次!之后不会再被调用! onPrepareOptionsMenu----每次display menu之前,都會调用该方法, ...

  5. ROLAP和MOLAP的概念和差别

    ROLAP和MOLAP的概念和差别OLAP(on-Line Analysis Processing)是使分析人员.管理人员或执行人员能够从多角度对信息进行快速.一致.交互地存取,从而获得对数据的更深入 ...

  6. apt-get upgarde和dist-upgrade的差别

    apt-get upgarde和dist-upgrade的差别 apt-get upgarde和dist-upgrade的差别   Debian/Ubuntu Linux都使用apt,升级时都是:  ...

  7. python与ruby的差别

    1.引用文件差别 Ruby:同一目录下的文件,如/usr/local/ruby/foo.rb与/usr/local/ruby/bar.rb两个文件.如果直接在foo.rb中 require 'bar' ...

  8. 【转】responseText,responseBody,responseXML差别

    为了做ajax的代理,研究了下服务器端的xmlhttp和客户端ajax中的xmlhttp,做了个比较 由于我一直使用JavaScript作为Asp的教本语言,所以比较起来更清楚.服务器端的xmlhtt ...

  9. 我的ORM之十二 -- 支持的数据库及差别

    我的ORM索引 支持最好的是SqlServer2005,Sqlserver2008,SqlServer2012 ,后续将支持:MySql,Sqlite,Oracle. 1.分页差别 MsSql 200 ...

随机推荐

  1. 从一个简单的Java单例示例谈谈并发 JMM JUC

    原文: http://www.open-open.com/lib/view/open1462871898428.html 一个简单的单例示例 单例模式可能是大家经常接触和使用的一个设计模式,你可能会这 ...

  2. ab测试

    PS:网站性能压力测试是性能调优过程中必不可少的一环.只有让服务器处在高压情况下才能真正体现出各种设置所暴露的问题.Apache中有个自带的,名为ab的程序,可以对Apache或其它类型的服务器进行网 ...

  3. IOT数据库选型——NOSQL,MemSQL,cassandra,Riak或者OpenTSDB,InfluxDB

    IoT databases should be as flexible as required by the application. NoSQLdatabases -- especially key ...

  4. python-用户登录小程序

    算是第一篇博客吧~哈哈哈 虽然说是为了完成作业,不过以后估计会常来分享.首先说一下下边这个程序的基本功能.毕竟是第一次写python程序还是有点小激动和满满的成就感的,下边这个程序: 1.输入不存在的 ...

  5. 合肥三洋股份,惠而浦家电携四大品牌-Take ,所有的市场

        大家都知道,数家电企业的日子并不好过.一方面,产品同质化竞争越发激烈.家电市场已进入了恶性价格战时代.还有一方面,消费者对家电产品的需求越发多元化.个性化.这意味着无法满足消费者需求的产品非常 ...

  6. android 自定义progressDialog实现

    我们在项目中经常会遇到这样一个应用场景:执行某个耗时操作时,为了安抚用户等待的烦躁心情我们一般会使用进度条之类的空间,在android中让 大家最容易想到的就是progressbar或者progres ...

  7. TI C66x DSP 系统events及其应用 - 5.10(创建ISR的三种情况)

    ISFP是服务中断的指令包,创建ISR的三种情况: 1.一个ISFP包的8条指令就能够满足ISR watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveWl5ZW ...

  8. 成为VR开发者的六个基本问题

    2016-05-31 小小CTO 未来CTO 我常被问起能否提供更多的建议,帮助其他人进入这个行业,或是做VR开发人员该怎么赚钱.我很难具体回答,因为每个人的情况都很不一样.不过还是有一些建议适用于想 ...

  9. gvim & vim

    安装了 GVim for Windows. 一 普通功能配置 配置文件 _vimrc 在安装目录下面. 关闭闪屏和声音提示功能: set visualbell t_vb= "关闭visual ...

  10. c#中去掉字符串空格方法

    (1)Trim方法 string   tt=" aaa "; tt=tt.Trim()       去字符串首尾空格的函数 tt=tt.TrimEnd() 去掉字符串尾空格 tt= ...