菜单在桌面应用程序中使用非常广泛,由于手机屏幕的制约,菜单在手机应用中减少不少。

android应用中的菜单默认是不可见的,只有当用户单击手机上“Menu”键时,系统才会显示该应用关联的采用项。

android应用同样支持上下文菜单(ContentMenu),用户一直按住某个应用的界面时,该应用所关联上下文菜单就会显示出来。

选项菜单和子菜单SubMenu 

注意:android系统默认做到只有6个菜单位,超过6个菜单,系统将会在第6个菜单位显示“更多”。

android系统的菜单支持主要通过4个接口来提现:

  Menu、SubMenu、ContextMenu、MeunItem

==>SubMenu:代表一个普通菜单,可以包含N个MenuItem(N>=1);

  ContextMenu:代表一个子菜单,可以包含N个MeunItem;

Menu定义了如下方法添加菜单或菜单项:

  MenuItem add(int titileRes):添加一个新的菜单项;

  MenuItem add(int groupId,int itemId,int order,CharSequence title):添加一个新的处于groupId组的菜单项;

  MenuItem add(int groupId,int itemId,int order,int titleRes):添加一个新的处于groupId组的菜单项;

  MenuItem add(CharSequence title):添加一个新的菜单项;

  SubMenu addSubMenu(int titleRes):添加一个新的菜单项;

  SubMenu addSubMenu(int groupId,int itemId,int order,int titleRes):添加一个新的处于groupId组的子菜单;

  SubMenu addSubMenu(CharSequence title):添加一个新的子菜单;

  SubMenu addSubMenu(int groupId,int itemId,int order,CharSequence title):添加一个新的处于groupId组的子菜单;

注意:add()用于添加菜单,addSubMenu()用于添加子菜单;这些方法的重载区别只是:是否将子菜单、菜单项添加到指定菜单中,是否使用资源文件中的字符串资源来设置标题。

SubMenu继承了Menu,其代表了一个子菜单项,额外提供了如下常用方法:

SubMenu setHeaderIcon(Drawable icon) 设置菜单的图标
SubMenu setHeaderIcon(int iconRes) 设置菜单的图标
SubMenu setHeaderTitle(int titleRes) 设置菜单的标题
SubMenu setHeaderTitle(CharSequence title) 设置菜单的标题
SubMenu setHeaderView(View view) 使用View来设置菜单头

添加菜单/菜单项的操作步骤:

  1.重写Activity的onCreateOptionsMenu(Menu menu),在该方法里调用Menu对象的方法来添加菜单项或子菜单;

  2.如果希望程序能响应菜单项的单击事件,重写Activity的onOptionsItemSelected(MenuItem item)方法即可;

实例:

布局文件==》
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" > <EditText
android:id="@+id/edit"
android:layout_width="match_parent"
android:layout_height="wrap_content" /> </LinearLayout> 代码实现==》
package com.example.mymenu; import android.os.Bundle;
import android.app.Activity;
import android.graphics.Color;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
import android.widget.EditText;
import android.widget.Toast; public class MainActivity extends Activity
{
// 定义字体大小菜单项的标识
final int font_10 = 0x111;
final int font_12 = 0x112;
final int font_14 = 0x113;
final int font_16 = 0x114;
final int font_18 = 0x115;
// 定义普通菜单的标识
final int plain_item = 0x11b;
// 定义字体颜色菜单项的标识
final int font_red = 0x116;
final int font_blue = 0x117;
final int font_green = 0x118;
EditText edit; @Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); edit = (EditText) this.findViewById(R.id.edit);
} @Override
public boolean onCreateOptionsMenu(Menu menu)
{
SubMenu fontMeun = menu.addSubMenu("字体大小");
// 设置菜单图标
fontMeun.setIcon(R.drawable.eighteen);
// 设置菜单头图标
fontMeun.setHeaderIcon(R.drawable.eighteen);
// 设置菜单的标题
fontMeun.setHeaderTitle("请选择字体大小");
fontMeun.add(0, font_10, 0, "10");
fontMeun.add(0, font_12, 0, "12");
fontMeun.add(0, font_14, 0, "14");
fontMeun.add(0, font_16, 0, "16");
fontMeun.add(0, font_18, 0, "18"); // 向Menu添加菜单项
menu.add(0, plain_item, 0, "普通菜单项"); SubMenu colorMenu = menu.addSubMenu("字体颜色");
// 设置菜单图标
colorMenu.setIcon(R.drawable.three);
// 设置菜单头图标
colorMenu.setHeaderIcon(R.drawable.three);
// 设置菜单的标题
colorMenu.setHeaderTitle("请选择字体颜色");
colorMenu.add(0, font_red, 0, "红色");
colorMenu.add(0, font_blue, 0, "蓝色");
colorMenu.add(0, font_green, 0, "绿色");
return super.onCreateOptionsMenu(menu);
} @Override
public boolean onOptionsItemSelected(MenuItem item)
{
switch (item.getItemId())
{
case font_10:
edit.setTextSize(10 * 2);
break;
case font_12:
edit.setTextSize(12 * 2);
break;
case font_14:
edit.setTextSize(14 * 2);
break;
case font_16:
edit.setTextSize(16 * 2);
break;
case font_18:
edit.setTextSize(18 * 2);
break; case font_red:
edit.setTextColor(Color.RED);
break;
case font_blue:
edit.setTextColor(Color.BLUE);
break;
case font_green:
edit.setTextColor(Color.GREEN);
break; case plain_item:
Toast.makeText(MainActivity.this, "单击了普通菜单项", Toast.LENGTH_LONG).show();
break;
}
return true;
} }

注意:程序中需要在onOptionsItemSelected(MenuItem item)中判断那个菜单项被选择了,因此在添加菜单时,需要为每个菜单添加ID.

运行效果:

                     

使用监听器监听菜单事件

除了重写onOptionsItemSelected(MenuItem item)可以响应菜单项被选择,同时支持通过为菜单项添加setOnMenuItemClickListener监听器监听菜单事件。

通过事件的处理方式,无须为每个菜单项添加ID.

使用方式如下图:

....

注意:建议采用重写onOptionsItemSelected(MenuItem item)方式实现菜单的事件处理.

创建复现菜单项和单选菜单项

如果需要创建的菜单项是单选菜单项或多选菜单项,则可调用MenuItem如下方法:

setCheckable(boolean checkable) 设置菜单项是否可以被勾选,调用该方法后的菜单项默认是多选菜单项
segGroupCheckable(int group,boolean checkable,boolean exclusive) 如果希望一组菜单项里的菜单项都设为可勾选的菜单项,则调用该方法;——设置group组里的所有菜单项是否可勾选,如果将exclusive设为true,那么其将是一组单选菜单项;
setAlphabeticShortcut(char aplhaChar) 设置字母快捷键
setNumericShortcut(char numericChar) 设置数字快捷键
setShortcut(char numericChar,char aplhaChar) 同时设置字母和数组快捷键

注意:

可勾选菜单的菜单必须由程序代码控制

实例如下:

布局文件==》
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" > <EditText
android:id="@+id/edit"
android:layout_width="match_parent"
android:layout_height="wrap_content" /> </LinearLayout> 代码实现==》
package com.example.mycheckmenu; import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
import android.widget.EditText; public class MainActivity extends Activity
{
final int MALE = 0x111;
final int FEMALE = 0x112;
final int RED = 0x113;
final int GREEN = 0x114;
final int BLUE = 0x115;
MenuItem[] Items = new MenuItem[3];
String[] ColorsName = new String[] { "红色", "绿色", "蓝色" };
EditText edit; @Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); edit = (EditText) this.findViewById(R.id.edit);
} @Override
public boolean onCreateOptionsMenu(Menu menu)
{
SubMenu m = menu.addSubMenu("性别:");
// 设置菜单图片
m.setIcon(R.drawable.eight);
// 设置菜单头的图标
m.setHeaderIcon(R.drawable.eight);
m.setHeaderTitle("请选择性别");
m.addSubMenu(0, MALE, 0, "男");
m.addSubMenu(0, FEMALE, 0, "女");
// 设置m菜单内0组菜单项为单选菜单项
m.setGroupCheckable(0, true, true); // 向m菜单中添加子菜单
SubMenu sub = m.addSubMenu("颜色");
sub.setIcon(R.drawable.sl);
// 设置菜单头的图标
sub.setHeaderIcon(R.drawable.sl);
sub.setHeaderTitle("请选择颜色");
// 添加菜单项,并设置为可勾选的菜单项
Items[0] = sub.add(0, RED, 0, ColorsName[0]).setCheckable(true);
Items[1] = sub.add(0, GREEN, 0, ColorsName[1]).setCheckable(true);
Items[2] = sub.add(0, BLUE, 0, ColorsName[2]).setCheckable(true);
// 设置快捷键
Items[2].setAlphabeticShortcut('A');
return super.onCreateOptionsMenu(menu);
} // 菜单项被单击后回调方法
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
switch (item.getItemId())
{
case MALE:
edit.setText("选择了性别为:男");
item.setChecked(true);// 必须通过代码更改勾选状态
break;
case FEMALE:
edit.setText("选择了性别为:女");
item.setChecked(true);// 必须通过代码更改勾选状态
break;
case RED:
case GREEN:
case BLUE:
setColor(item);
break;
}
return super.onOptionsItemSelected(item);
} private void setColor(MenuItem item)
{
if (item.isChecked())
{
item.setChecked(false);
} else
{
item.setChecked(true);
}
StringBuffer buf = new StringBuffer();
buf.append("选择的颜色有:");
for (int i = 0; i < Items.length; i++)
{
if (Items[i].isChecked())
{
buf.append(ColorsName[i]);
buf.append("、");
}
}
edit.setText(buf);
}
}

运行效果:

            

设置与菜单项关联的Activity

设置与菜单项关联的Activity——即,应用程序单击某个菜单项时启动Activity。

对于此种需求,只需要处理MenuItem的setIntent(Intent intent)方法即可——该方法把该菜单项与指定的intent关联到一起,当用户单击该菜单项时,该Intent所代表的组件将会被启动。

实例:

注意:新添加的Activity,需要在AndroidMainfext.xml添加定义。

上下文菜单

android用ContextMeun来代表上下文菜单,为android应用开发上下文菜单与开发选项菜单的方法基本相似,ContextMenu继承Menu,因此程序可使用相同的方法为其添加菜单项。

开发上下文菜单与开发选项菜单的区别:

  上下文菜单不是重写onCreateOptionsMenu(Menu menu)方法,而是重写onCreateContextMenu(ContextMenu menu,View view,ContextMenu.ContextMenuInfo menuInfo)方法——其中view参数代表触发上下文菜单的组件。

开发上下文菜单的步骤如下:

  1.重写Activity的onCreateContextMenu(ContextMenu menu,View view,ContextMenu.ContextMenuInfo menuInfo)方法;

  2.调用Activity的registerForContextMenu(View view)方法为组件注册上下文菜单;

  3.如果希望程序可以为菜单提供响应,可重写onContextItemSelected(MenuItem mi)方法,或为指定菜单绑定事件监听器;

ContextMenu常用方法如下:

ContextMenu setHeaderIcon(Drawable icon) 为上下文菜单设置图标
ContextMenu setHeaderIcon(int iconRes) 为上下文菜单设置图标
ContextMenu setHeaderTitle(int titleRes) 为上下文菜单设置标题

注意:android中提供了两种创建菜单的方式,一种是通过java代码创建,一种是使用XML资源文件定义。

     一般建议使用XML资源文件定义方式创建菜单。

实例:

布局文件==》
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" > <TextView
android:id="@+id/tvContent"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="110110110110" /> </LinearLayout> 代码实现==》
package com.example.mycontextmenu; import android.os.Bundle;
import android.app.Activity;
import android.graphics.Color;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView; public class MainActivity extends Activity
{
final int Menu1 = 0x111;
final int Menu2 = 0x112;
final int Menu3 = 0x113;
TextView TvContent; @Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); TvContent = (TextView) this.findViewById(R.id.tvContent);
// 为文本框注册上下文菜单
registerForContextMenu(TvContent);
} @Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo)
{
menu.addSubMenu(0, Menu1, 0, "红色");
menu.addSubMenu(0, Menu2, 0, "绿色");
menu.addSubMenu(0, Menu3, 0, "蓝色");
// 设置菜单头的图标
menu.setGroupCheckable(0, true, true);
menu.setHeaderIcon(R.drawable.three);
menu.setHeaderTitle("请选择颜色"); super.onCreateContextMenu(menu, v, menuInfo);
} @Override
public boolean onContextItemSelected(MenuItem item)
{
switch (item.getItemId())
{
case Menu1:
item.setChecked(true);
TvContent.setBackgroundColor(Color.RED);
break;
case Menu2:
item.setChecked(true);
TvContent.setBackgroundColor(Color.GREEN);
break;
case Menu3:
item.setChecked(true);
TvContent.setBackgroundColor(Color.BLUE);
break;
}
return super.onContextItemSelected(item);
} @Override
public boolean onCreateOptionsMenu(Menu menu)
{
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
} }

运行效果:

长按“110110110110”

android学习笔记23——菜单的更多相关文章

  1. Android学习笔记--Menu菜单的使用

    实现选项菜单.上下文菜单,以及菜单内部的子菜单. 视图效果: MainActivity 选项菜单 选项菜单的子菜单 上下文菜单(按住按钮或者EditText弹出) 注意:上下文菜单如何弹出?在注册该菜 ...

  2. Android学习笔记上下文菜单

    布局文件main_activity.xml <?xml version="1.0" encoding="utf-8"?> <RelativeL ...

  3. Android学习笔记(23):列表项的容器—AdapterView的子类们

    AdapterView的子类的子类ListView.GridView.Spinner.Gallery.AdapterViewFlipper和StackView都是作为容器使用,Adapter负责提供各 ...

  4. 【转】 Pro Android学习笔记(三五):Menu(6):XML方式 & PopUp菜单

    目录(?)[-] 利用XML创建菜单 XML的有关属性 onClick事件 Pop-up菜单 利用XML创建菜单 在代码中对每个菜单项进行设置,繁琐且修改不灵活,不能适配多国语言的要求,可以利用资源进 ...

  5. 【转】 Pro Android学习笔记(三三):Menu(4):Alternative菜单

    目录(?)[-] 什么是Alternative menu替代菜单 小例子说明 Alternative menu代码 关于Category和规范代码写法 关于flags 多个匹配的itemId等参数 什 ...

  6. 【转】Pro Android学习笔记(十):了解Intent(上)

    目录(?)[-] Intent基本含义 系统的Intent Android引入了Intent的概念来唤起components,component包括:1.Activity(UI元件) 2.Servic ...

  7. Android学习笔记(一)

    目录 Android学习笔记(一) 一.JDK.Android SDK 二.部分项目结构 三.字符串引用 四.外层build.gradle详解 五.app->build.gradle详解 六.日 ...

  8. Android学习笔记之JSON数据解析

    转载:Android学习笔记44:JSON数据解析 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种 ...

  9. Android学习笔记36:使用SQLite方式存储数据

    在Android中一共提供了5种数据存储方式,分别为: (1)Files:通过FileInputStream和FileOutputStream对文件进行操作.具体使用方法可以参阅博文<Andro ...

随机推荐

  1. 安装CDH4 (Cloudera Distribution Hadoop)步骤

    安装流程 机器和系统 3台服务器,安装centos 6.4 64bit系统,内存8G,磁盘60G,cpu单核 已配置好静态ip,并配置好/etc/hosts 下载cdh4版本 https://www. ...

  2. SAP 增强说明

    转自http://blog.csdn.net/lyb_yt/article/details/8177974 (一)什么是增强(Enhancement)? 简单地说,增强就是ERP系统中标准程序的出口, ...

  3. OpenCV图像Surf与flann特征点(转载)

    Surf(Speed Up Robust Feature) Surf算法的原理                                                             ...

  4. 229. Majority Element II

    Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times. The algorit ...

  5. html部分---样式属性;

    <!--大小--> width:宽度 height:高度 <!--背景与前景--> "background-color:#0F0; 背景颜色 background-i ...

  6. Hibernate——property的access属性

    public class Customer implements Serializable { private static final long serialVersionUID = 1L;     ...

  7. HDU 1231 最大连续子序列 --- 入门DP

    HDU 1231 题目大意以及解题思路见: HDU 1003题解,此题和HDU 1003只是记录的信息不同,处理完全相同. /* HDU 1231 最大连续子序列 --- 入门DP */ #inclu ...

  8. LeetCode()Substring with Concatenation of All Words 为什么我的超时呢?找不到原因了!!!

    超时代码 class Solution { public: vector<int> findSubstring(string s, vector<string>& wo ...

  9. P364 实战练习(多线程)

    尝试定义一个继承Thread类的类,并覆盖run( )方法,在run( )方法中每隔1000毫秒打印一句话. 编写代码如下: 编写PractiseThread类: package org.hanqi. ...

  10. Linux系统编程@文件操作(一)

    只总结了部分常用的内容,详细内容参考<UNIX环境高级编程>及相关书籍. Linux中文件编程可以使用两种方法 Linux系统调用(依赖于系统) C语言库函数(不依赖于系统) Linux系 ...