android学习笔记23——菜单
菜单在桌面应用程序中使用非常广泛,由于手机屏幕的制约,菜单在手机应用中减少不少。
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——菜单的更多相关文章
- Android学习笔记--Menu菜单的使用
实现选项菜单.上下文菜单,以及菜单内部的子菜单. 视图效果: MainActivity 选项菜单 选项菜单的子菜单 上下文菜单(按住按钮或者EditText弹出) 注意:上下文菜单如何弹出?在注册该菜 ...
- Android学习笔记上下文菜单
布局文件main_activity.xml <?xml version="1.0" encoding="utf-8"?> <RelativeL ...
- Android学习笔记(23):列表项的容器—AdapterView的子类们
AdapterView的子类的子类ListView.GridView.Spinner.Gallery.AdapterViewFlipper和StackView都是作为容器使用,Adapter负责提供各 ...
- 【转】 Pro Android学习笔记(三五):Menu(6):XML方式 & PopUp菜单
目录(?)[-] 利用XML创建菜单 XML的有关属性 onClick事件 Pop-up菜单 利用XML创建菜单 在代码中对每个菜单项进行设置,繁琐且修改不灵活,不能适配多国语言的要求,可以利用资源进 ...
- 【转】 Pro Android学习笔记(三三):Menu(4):Alternative菜单
目录(?)[-] 什么是Alternative menu替代菜单 小例子说明 Alternative menu代码 关于Category和规范代码写法 关于flags 多个匹配的itemId等参数 什 ...
- 【转】Pro Android学习笔记(十):了解Intent(上)
目录(?)[-] Intent基本含义 系统的Intent Android引入了Intent的概念来唤起components,component包括:1.Activity(UI元件) 2.Servic ...
- Android学习笔记(一)
目录 Android学习笔记(一) 一.JDK.Android SDK 二.部分项目结构 三.字符串引用 四.外层build.gradle详解 五.app->build.gradle详解 六.日 ...
- Android学习笔记之JSON数据解析
转载:Android学习笔记44:JSON数据解析 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种 ...
- Android学习笔记36:使用SQLite方式存储数据
在Android中一共提供了5种数据存储方式,分别为: (1)Files:通过FileInputStream和FileOutputStream对文件进行操作.具体使用方法可以参阅博文<Andro ...
随机推荐
- python 的一些小技巧
赋值: a, b, c = 'xixi', 'haha', 'hehe' 连接字典: >>> s = {1:'a', 2:'b', 3:'c'} >>> s.key ...
- yii2 文件上传
直接贴代码了 --------------------------------------------------------------------------------------------- ...
- Hibernate--Enum类型的set集合映射到数据库(xml配置文件实现方式)
使用enum 存储Permission的值 package demo; public enum Permission { CREATE,DELETE,UPDATE;} Role与Permissi ...
- 选数 2002年NOIP全国联赛普及组
题目描述 Description 已知 n 个整数 x1,x2,-,xn,以及一个整数 k(k<n).从 n 个整数中任选 k 个整数相加,可分别得到一系列的和.例如当 n=4,k=3,4 个整 ...
- PHP 页面自动刷新可借助JS来实现,简单示例如下:
<?php echo "系统当前时间戳为:"; echo ""; echo time(); //<!--JS 页面自动刷新 --> echo ...
- hive学习笔记_hive的表创建
创建hive表注意事项 一.表分隔符必须与读取的数据文件一致,比如例子的分隔符为 '\t'(制表符),hive下默认分隔符是制表符. 二.最好指定分区作为数据之间的区分. 三.创建完表可以desc+表 ...
- svn 安装 、使用(1)
写在开头: 虽然网络极大的方便了我们查找答案,而且有很多人写各样的博客.但每个人在实际中的情况不一样,遇到的问题也不一样,大牛们会把步骤写的很简单,可能真的是怕麻烦,但显然就有一些东西已经不适合一部分 ...
- JAVA常用系统函数
1.System.out.println("显示信息"); // 显示内容,并自动换行 2.Syetem.out.print("显示信息"); // 显示内容, ...
- Linux常用配置文件解析
网络相关配置文件 1./etc/sysconfig/network-scripts/ifcfg-ethx 网络参数IP/子网掩码/广播地址等的配置(重启有效) 2./etc/resolv.conf ...
- android基础知识13:AndroidManifest.xml文件解析
注:本文转载于:http://blog.csdn.net/xianming01/article/details/7526987 AndroidManifest.xml文件解析. 1.重要性 Andro ...