作者:刘昊昱

博客:http://blog.csdn.net/liuhaoyutz

Android中的菜单分为选项菜单(OptionMenu)和上下文菜单(Context Menu)。通常使用菜单资源文件创建菜单。菜单资源文件通常放置在res\menu目录下,这个目录默认情况下是不存在的,需要我们自己创建该目录。菜单资源的根元素通常是<menu></menu>标记,在该标记中可以包含两种子元素:

1、<item></item>标记,用于定义菜单项。如果某个菜单项中还包括子菜单,可以通过在该菜单项中再包含<menu></menu>标记来实现。

2、<group></group>标记,用于将多个<item></item>标记定义的菜单包装成一个菜单组。

一、菜单的创建步骤

1、  选项菜单

当用户单击菜单按钮时,弹出的菜单就是选项菜单,创建选项菜单的步骤如下:

(1)      重写Activity的onCreateOptionsMenu()方法。在该方法中,首先创建一个用于解析菜单资源文件的MenuInflater对象,然后调用该对象的inflate()方法解析一个菜单资源文件,并把解析后的菜单保存在menu中。关键代码如下:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater=new MenuInflater(this); //实例化一个MenuInflater对象
inflater.inflate(R.menu.optionmenu, menu); //解析菜单文件
return true;
}

(2)      重写onOptionsItemSelected()方法,用于当菜单被选择时,做出相应处理。关键代码举例如下:

// Called when an options item is clicked
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_setting:
Log.d(TAG, "menu item setting is selected.");
startActivity(new Intent(this, Settings.class));
break;
case R.id.menu_history:
Log.d(TAG, "menu item history is selected.");
startActivity(new Intent(this, History.class));
break;
case R.id.menu_about:
Log.d(TAG, "menu item about is selected.");
break;
}
return true;
}

2、  上下文菜单

当用户在某个控件上长时间按住不放,这时弹出的菜单就是上下文菜单。创建上下文菜单的步骤如下:

(1)、在Activity的onCreate()方法中注册上下文菜单,例如,为文本框组件注册上下文菜单(也就是说在按住该文本框时,才显示上下文菜单),可以使用下面的代码,:

TextView tv = (TextView)findViewById(R.id.textView);
registerForContextMenu(tv);

(2)、重写Activity的onCreateContextMenu()方法,在该方法中,首先创建一个用于解析菜单资源的MenuInflater对象,然后调用该对象的inflate()方法解析菜单资源文件,并把解析后的菜单保存在menu中,最后为菜单头设置图标和标题。关键代码如下:

	@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
MenuInflater inflator=new MenuInflater(this); //实例化一个MenuInflater对象
inflator.inflate(R.menu.contextmenu, menu); //解析菜单文件
menu.setHeaderIcon(R.drawable.ic_launcher); //为菜单头设置图标
menu.setHeaderTitle("选择颜色:"); //为菜单头设置标题 }

(3)、重写onContextItemSelected()方法,用于当菜单被选择时,做出相应处理。关键代码如下:

	@Override
public boolean onContextItemSelected(MenuItem item) {
switch(item.getItemId()){
case R.id.color1: //当选择红颜色时
tv.setTextColor(Color.rgb(255, 0, 0));
break;
case R.id.color2: //当选择绿颜色时
tv.setTextColor(Color.rgb(0, 255, 0));
break;
default:
tv.setTextColor(Color.rgb(255, 255, 255));
}
return true;
}

二、 菜单应用举例

下面我们来看一个使用菜单的例子,该程序运行效果如下:

先来看主布局文件:

<?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:gravity="center"
android:orientation="vertical" > <TextView
android:id="@+id/phone_name"
android:textSize="25dp"
android:gravity="center"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello" /> </LinearLayout>

因为要创建context menu和option menu,所以在res/menu目录下分别创建contextmenu.xml和optionmenu.xml,contextmenu.xml内容如下:

<?xml version="1.0"encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/name1" android:title="苹果"></item>
<item android:id="@+id/name2" android:title="三星"></item>
<item android:id="@+id/name3" android:title="联想"></item>
<item android:id="@+id/name4" android:title="小米"></item>
</menu>

optionmenu.xml内容如下:

<?xml version="1.0"encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/default_font" android:title="恢复默认字体" android:alphabeticShortcut="r"></item>
<item android:id="@+id/font_size" android:title="字体大小" android:alphabeticShortcut="e">
<menu>
<group android:id="@+id/font_size_group" android:checkableBehavior="single">
<item android:id="@+id/size_20"android:title="20dp"></item>
<item android:id="@+id/size_30"android:title="30dp"></item>
</group>
</menu>
</item>
</menu>

最后来看主Activity文件,其内容如下:

package com.liuhaoyu;

import android.app.Activity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast; public classMainActivity extends Activity {
TextViewtext_phone_name; /** Called when the activity is firstcreated. */
@Override
publicvoidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main); text_phone_name = (TextView)findViewById(R.id.phone_name);
registerForContextMenu(text_phone_name); } @Override
public booleanonContextItemSelected(MenuItem item) {
// TODO Auto-generated method stub
switch(item.getItemId())
{
case R.id.name1:
text_phone_name.setText("苹果");
break;
case R.id.name2:
text_phone_name.setText("三星");
break;
case R.id.name3:
text_phone_name.setText("联想");
break;
case R.id.name4:
text_phone_name.setText("小米");
break;
default:
text_phone_name.setText("请选择手机品牌");
}
return super.onContextItemSelected(item);
} @Override
public voidonContextMenuClosed(Menu menu) {
// TODO Auto-generated method stub
super.onContextMenuClosed(menu);
Toast.makeText(MainActivity.this, "context menu close",Toast.LENGTH_SHORT).show();
} @Override
public voidonCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfomenuInfo) {
// TODO Auto-generated method stub
super.onCreateContextMenu(menu,v, menuInfo);
MenuInflaterinflater = newMenuInflater(this);
inflater.inflate(R.menu.contextmenu, menu);
menu.setHeaderIcon(R.drawable.ic_launcher);
menu.setHeaderTitle("请选择手机品牌");
} @Override
public booleanonCreateOptionsMenu(Menu menu) {
// TODO Auto-generated method stub
MenuInflaterinflater=newMenuInflater(this);
inflater.inflate(R.menu.optionmenu, menu);
return super.onCreateOptionsMenu(menu);
} @Override
public booleanonOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
if(item.getGroupId()==R.id.font_size_group){
if(item.isChecked()){ //当菜单项已经被选中
item.setChecked(false); //设置菜单项不被选中
}else{
item.setChecked(true); //设置菜单项被选中
}
if(item.getItemId()==R.id.size_20)
{
text_phone_name.setTextSize(20);
}
if(item.getItemId()==R.id.size_30)
{
text_phone_name.setTextSize(30);
}
}
if(item.getItemId()==R.id.default_font)
{
text_phone_name.setTextSize(25);
}
if(item.getItemId()!=R.id.font_size){
Toast.makeText(MainActivity.this, item.getTitle(),Toast.LENGTH_SHORT).show();
}
return super.onOptionsItemSelected(item);
} @Override
public voidonOptionsMenuClosed(Menu menu) {
// TODO Auto-generated method stub
super.onOptionsMenuClosed(menu);
Toast.makeText(MainActivity.this, "option menu close",Toast.LENGTH_SHORT).show();
} }

Android应用开发学习笔记之菜单的更多相关文章

  1. Android应用开发学习笔记之播放音频

    作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz Android支持常用音视频格式文件的播放,本文我们来学习怎样开发Android应用程序对音视频进行操作. Andr ...

  2. android移动开发学习笔记(二)神奇的Web API

    本次分两个大方向去讲解Web Api,1.如何实现Web Api?2.如何Android端如何调用Web Api?对于Web Api是什么?有什么优缺点?为什么用WebApi而不用Webservice ...

  3. Android应用开发学习笔记之事件处理

    作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz Android提供的事件处理机制分为两类:一是基于监听的事件处理:二是基于回调的事件处理.对于基于监听的事件处理,主 ...

  4. Android应用开发学习笔记之AsyncTask

    作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz 在上一篇文章中我们学习了多线程和Handler消息处理机制,如果有计算量比较大的任务,可以创建一个新线程执行计算工作 ...

  5. [Android游戏开发学习笔记]View和SurfaceView

    本文为阅读http://blog.csdn.net/xiaominghimi/article/details/6089594的笔记. 在Android游戏中充当主要角色的,除了控制类就是显示类.而在A ...

  6. Android应用开发学习笔记之Fragment

    作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz Fragment翻译成中文就是“碎片”.“片断”的意思,Fragment通常用来作为一个Activity用户界面的一 ...

  7. Android应用开发学习笔记之Intent

    作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz Intent是什么呢?来看Android官网上的定义: An intent is an abstractdescri ...

  8. Android应用开发学习笔记之多线程与Handler消息处理机制

    作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz 和JAVA一样,Android下我们可以通过创建一个Thread对象实现多线程.Thread类有多个构造函数,一般通 ...

  9. Android应用开发学习笔记之BroadcastReceiver

    作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz 一.BroadcastReceiver机制概述 Broadcast Receiver是Android的一种“广播发布 ...

随机推荐

  1. 【Subsets】cpp

    题目: Given a set of distinct integers, nums, return all possible subsets. Note: Elements in a subset ...

  2. python 字典列表排序operator.itemgetter()

    举例: import operator x = [{'name':'Homer', 'age':39}, {'name':'Bart', 'age':10}] sorted_x = sorted(x, ...

  3. python 实现斐波那契数列

    def fib(n): a,b=0,1 while a<n: print(a,end=" ") a,b=b,a+b print() fib(2000) 输出: 0 1 1 2 ...

  4. 3527: [Zjoi2014]力 - BZOJ

    题目大意:给出n个数qi,定义 Fj为        令 Ei=Fi/qi,求Ei. 看了很久题解,终于有些眉目,因为知道要用FFT,所以思路就很直了 其实我们就是要±1/(j-i)^2 ( j-i大 ...

  5. 机器学习&&数据挖掘之一:决策树基础认识

    决策树入门篇 前言:分类是数据挖掘中的主要分析手段,其任务就是对数据集进行学习并构造一个拥有预测功能的分类模型,用于预测未知样本的类标号,把类标号未知的样本按照某一规则映射到预先给定的类标号中. 分类 ...

  6. list<T> 自定义比较器进行排序

    今天在研究List<T> 集合如何排序,我试过很多,但是都不行,然后看到msdn中的这个比较器排序,自己测试了代码,No Problem.给大家分享一下. 类型 T 的默认比较器按如下方式 ...

  7. Android线程消息通信(一)

    Android在Java标准线程模型的基础上,提供了消息驱动机制,用于多线程之间的通信.基于消息驱动机制的线程通信模型陈伟线程消息通信.在标准线程模型中,线程执行完毕后便退出,而Android扩展了线 ...

  8. BZOJ 3224: Tyvj 1728 普通平衡树 vector

    3224: Tyvj 1728 普通平衡树 Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除 ...

  9. Good Bye 2014 D. New Year Santa Network 图论+期望

    D. New Year Santa Network   New Year is coming in Tree World! In this world, as the name implies, th ...

  10. Java集合框架(二)

    Set Set:无序,不可以重复元素. |--------HashSet:数据结构是哈希表. 线程是非同步的.保证元素唯一性的原理是:判断元素的hashCode值是否相同,如果相同,还会继续判断元素的 ...