Android开发手记(12) Menu的使用
Android中的Menu分为三种,分别为:OptionsMenu(选项菜单)、ContextMenu(上下文菜单)、SubMenu(子菜单)。
1、OptionsMenu
//menu.add(groupId, itemId, order, title); 通过add()增加menuItem,每个menuItem有groupId,itemId,Order。这三个属性是相互独立,没有关联。
MenuItem redMenu = menu.add(MENU_GROUP_1, 0, 0, "Red");
MenuItem OrangedMenu = menu.add(MENU_GROUP_1, 1, 1, "Orange");
MenuItem YellowMenu = menu.add(MENU_GROUP_2, 2, 2, "Yellow");
MenuItem GreenMenu = menu.add(MENU_GROUP_2, 3, 3, "Green");
MenuItem BlueMenu = menu.add(MENU_GROUP_2, 4, 4, "Blue");
MenuItem CyangonMenu = menu.add(MENU_GROUP_3, 5, 5, "Cyangon");
MenuItem PurpleMenu = menu.add(MENU_GROUP_3, 6, 6, "Purple");
menu.setGroupCheckable(MENU_GROUP_2, true /*isCheckable*/, false);//第三个参数true为单选,false为多选
menu.setGroupEnabled(MENU_GROUP_2, true/*isEnabled*/);
menu.setGroupVisible(MENU_GROUP_2, true/*isVisible*/);
menu.setGroupCheckable(MENU_GROUP_3, true, true);
完整代码如下:
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast; public class MainActivity extends AppCompatActivity { private static int MENU_GROUP_1 = 1;
private static int MENU_GROUP_2 = 2;
private static int MENU_GROUP_3 = 3; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuItem redMenu = menu.add(MENU_GROUP_1, 0, 0, "Red");
MenuItem OrangedMenu = menu.add(MENU_GROUP_1, 1, 1, "Orange");
MenuItem YellowMenu = menu.add(MENU_GROUP_2, 2, 2, "Yellow");
MenuItem GreenMenu = menu.add(MENU_GROUP_2, 3, 3, "Green");
MenuItem BlueMenu = menu.add(MENU_GROUP_2, 4, 4, "Blue");
MenuItem CyangonMenu = menu.add(MENU_GROUP_3, 5, 5, "Cyangon");
MenuItem PurpleMenu = menu.add(MENU_GROUP_3, 6, 6, "Purple"); menu.setGroupCheckable(MENU_GROUP_2, true /*isCheckable*/, false);//第三个参数true为单选,false为多选
menu.setGroupEnabled(MENU_GROUP_2, true/*isEnabled*/);
menu.setGroupVisible(MENU_GROUP_2, true/*isVisible*/);
menu.setGroupCheckable(MENU_GROUP_3, true, true); return super.onCreateOptionsMenu(menu);
} @Override
public boolean onOptionsItemSelected(MenuItem item) {
super.onOptionsItemSelected(item);
switch (item.getItemId()) {
case 0:
Toast.makeText(this, "Red", Toast.LENGTH_SHORT).show();
break;
case 1:
Toast.makeText(this, "Orange", Toast.LENGTH_SHORT).show();
break;
case 2:
if(item.isCheckable()){
item.setChecked(!item.isChecked());
}
break;
case 3:
if(item.isCheckable()){
item.setChecked(!item.isChecked());
}
break;
case 4:
if(item.isCheckable()){
item.setChecked(!item.isChecked());
}
break;
case 5:
if(item.isCheckable()){
item.setChecked(true);
}
break;
case 6:
if(item.isCheckable()){
item.setChecked(true);
}
break;
}
return true;
} }
MainActivity.java
![]() |
![]() |
2、ContextMenu
要在相应的view上按几秒后才显示的,用于view,跟某个具体的view绑定在一起。这类型的菜单不支持icon和快捷键!
在Activity里面,一般通过以下函数来使用context menu:
menu.setHeaderTitle("ContextMenu");
menu.add(GROUP_COLOR, 0, 0, "Red");
menu.add(GROUP_COLOR, 1, 1, "Green");
menu.add(GROUP_COLOR, 2, 2, "Blue");
菜单响应事件处理和OptionMenu类似。
public class MainActivity extends AppCompatActivity {
private TextView colorText;
private static int GROUP_COLOR = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
colorText = (TextView) findViewById(R.id.textView);
registerForContextMenu(colorText);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
menu.setHeaderTitle("ContextMenu");
menu.add(GROUP_COLOR, 0, 0, "Red");
menu.add(GROUP_COLOR, 1, 1, "Green");
menu.add(GROUP_COLOR, 2, 2, "Blue");
}
@Override
public boolean onContextItemSelected(MenuItem item) {
super.onContextItemSelected(item);
switch (item.getItemId()) {
case 0:
colorText.setTextColor(Color.RED);
break;
case 1:
colorText.setTextColor(Color.GREEN);
break;
case 2:
colorText.setTextColor( Color.BLUE);
break;
}
return true;
}
}
3、SubMenu
SubMenu可以和OptionMenu、ContextMenu配合使用,但子菜单不能嵌套子菜单,这意味着在Android系统,菜单只有两层。同时子菜单不支持icon。
可以在onCreateOptionMenu或者onCreateContextMenu内定义SubMenu:
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo); menu.setHeaderTitle("ContextMenu");
menu.add(GROUP_COLOR, 0, 0, "Red");
menu.add(GROUP_COLOR, 1, 1, "Green");
menu.add(GROUP_COLOR, 2, 2, "Blue"); SubMenu subMenu = menu.addSubMenu(Menu.NONE, 10, 10, "Text Size");
subMenu.add(Menu.NONE, 11, 11, "Large");
subMenu.add(Menu.NONE, 12, 12, "Small");
}
完整代码:
import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
import android.view.View;
import android.widget.TextView; public class MainActivity extends AppCompatActivity { private TextView colorText;
private static int GROUP_COLOR = 1; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); colorText = (TextView) findViewById(R.id.textView);
registerForContextMenu(colorText);
} @Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo); menu.setHeaderTitle("ContextMenu");
menu.add(GROUP_COLOR, 0, 0, "Red");
menu.add(GROUP_COLOR, 1, 1, "Green");
menu.add(GROUP_COLOR, 2, 2, "Blue"); SubMenu subMenu = menu.addSubMenu(Menu.NONE, 10, 10, "Text Size");
subMenu.add(Menu.NONE, 11, 11, "Large");
subMenu.add(Menu.NONE, 12, 12, "Small");
} @Override
public boolean onContextItemSelected(MenuItem item) {
super.onContextItemSelected(item); switch (item.getItemId()) {
case 0:
colorText.setTextColor(Color.RED);
break;
case 1:
colorText.setTextColor(Color.GREEN);
break;
case 2:
colorText.setTextColor( Color.BLUE);
break;
case 11:
colorText.setTextSize(30);
break;
case 12:
colorText.setTextSize(20);
break;
}
return true;
} }
MainActivity.java
4、XML定义菜单
首先在/res/menu新建一个menu_main.xml,在其中定义相关Menu
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".MainActivity">
<item android:id="@+id/subMenu"
android:title="SubMenu" >
<menu> <!--定义子菜单-->
<item android:id="@+id/subLarge"
android:title="Large"/>
<item android:id="@+id/subSmall"
android:title="Small"/>
</menu>
</item>
<!--定义菜单组1-->
<group android:id="@+id/group1"
android:checkableBehavior="single"
android:enabled="true">
<item android:id="@+id/redMenu"
android:title="Red"/>
<item android:id="@+id/blueMenu"
android:title="Blue"/>
</group>
<!--定义菜单组2-->
<group android:id="@+id/group2"
android:checkableBehavior="all"
android:enabled="true">
<item android:id="@+id/greenMenu"
android:title="Green"/>
<item android:id="@+id/purpleMenu"
android:title="Purple"/>
</group>
</menu>
(1)XML定义OptionsMenu
重载onCreateOptionsMenu即可:
@Override
public boolean onCreateOptionsMenu(Menu menu){
MenuInflater menuInflater = new MenuInflater(getApplication());
menuInflater.inflate(R.menu.menu_main, menu);
return super.onCreateOptionsMenu(menu);
}
完整代码为:
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.widget.TextView; public class MainActivity extends AppCompatActivity { private TextView colorText; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
} @Override
public boolean onCreateOptionsMenu(Menu menu){
MenuInflater menuInflater = new MenuInflater(getApplication());
menuInflater.inflate(R.menu.menu_main, menu);
return super.onCreateOptionsMenu(menu);
} }
MainActivity.java
(2)XML定义ContextMenu
首先为ContextMenu注册菜单项
colorText = (TextView)findViewById(R.id.textView);
registerForContextMenu(colorText);
然后重载onCreateContextMenu即可:
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo); getMenuInflater().inflate(R.menu.menu_main, menu);
}
完整代码为:
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.View;
import android.widget.TextView; public class MainActivity extends AppCompatActivity { private TextView colorText; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); colorText = (TextView)findViewById(R.id.textView);
registerForContextMenu(colorText);
} @Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo); getMenuInflater().inflate(R.menu.menu_main, menu);
} }
MainActivity.java
Android开发手记(12) Menu的使用的更多相关文章
- Android 开发手记一NDK编程实例
在Android上,应用程序的开发,大部分基于Java语言来实现.要使用c或是c++的程序或库,就需要使用NDK来实现.NDK是Native Development Kit的简称.它是一个工具集,集成 ...
- Android开发手记(28) Handler和Looper
Android的消息处理有三个核心类:Looper,Handler和Message.其实还有一个Message Queue(消息队列),但是MQ被封装到Looper里面了,我们不会直接与MQ打交道.平 ...
- Android开发手记(24) Log的使用及颜色的更改
在程序开发过程中,LOG是广泛使用的用来记录程序执行过程的机制,它既可以用于程序调试,也可以用于产品运营中的事件记录.在Android系统中,提供了简单.便利的LOG机制,开发人员可以方便地使用.本文 ...
- Android开发手记(7) 按钮类控件的使用
1.点击Button改变页面背景色 通过Button改变页面背景色,首先新建相应的对象,让后绑定到Layout上的元素. final RelativeLayout layout = (Relative ...
- [Android开发常见问题-12] Android开发中debug.keystore如何使用。
有些团度在开发较大的项目的时候会用到debug.keystore这种debug签名,那么这个东西怎么用呢?之前在导出签名包的时候只需要android tools -> export signed ...
- Android开发中的menu菜单
复写onCreateOptionsMenu方法,当点击menu菜单时,调用该方法. @Override public boolean onCreateOptionsMenu(Menu menu) { ...
- Android开发手记(22) 传感器的使用
Android的传感器主要包括八大传感器,他们分别是:加速度传感器(accelerometer).陀螺仪(gyroscope).方向传感器(orientation).磁力传感器(magnetic fi ...
- Android开发手记(18) 数据存储三 SQLite存储数据
Android为数据存储提供了五种方式: 1.SharedPreferences 2.文件存储 3.SQLite数据库 4.ContentProvider 5.网络存储 SQLite 是以嵌入式为目的 ...
- Android开发手记(17) 数据存储二 文件存储数据
Android为数据存储提供了五种方式: 1.SharedPreferences 2.文件存储 3.SQLite数据库 4.ContentProvider 5.网络存储 本文主要介绍如何使用文件来存储 ...
随机推荐
- php错误级别设置
在php.ini中可以设置服务器对错误的报警级别.在默认情况下,php将报告除了通知之外的所有错误. 错误报告级别是通过一些预定义的常量来设置的, 语法 int error_reporting ( [ ...
- CLR via C#可空值类型
我们知道,一个值类型的变量永远不可能为null.它总是包含值类型本身.遗憾的是,这在某些情况下会成为问题.例如,设计一个数据库时,可将一个列定义成为一个32位的整数,并映射到FCL的Int32数据类型 ...
- Unix中$$、$@、$#、$*的意思
$$: 表示当前命令进程的PID $#: 表示参数的个数 $@ 和 $* : 都表示输出所有的参数 区别: $*:表示合并为一个参数 “$1 $2 $3 $n” $@:表示分解为多个参数 “$1” ...
- JQuery整体大纲
今天公司放假,闲的无聊,就总结了一套JQuery的笔记,我感觉更像是大纲,在这里跟大家分享一下,这是我的成果: 这个就是我的劳动成果了,说实话真是不容易,为了做这个东西,翻阅了很多以前做过的笔记,发现 ...
- Android4.2增加新键值
这里添加新的键值,不是毫无凭据凭空创造的一个键值, 而是根据kernel中检测到的按键值,然后转化为android所需要的数值: 以添加一个linux键值为217,把它映射为android的键值Bro ...
- WordPress网站更换老鹰主机详细操作
眼看着之前买的虚拟主机就要到期了,本着节约至上的美德,就和同事一起买了老鹰主机.因为第一次网站的配置是一个朋友帮忙的,所以现在想完全自己动手操作,毕竟之后的博客维护还是得靠自己.下面就来和我一起学习怎 ...
- 转:你需要知道的NoSQL数据库10件事
你需要知道的NoSQL数据库10件事 NoSQL的5个优势 1.弹性扩展 多年来,数据库管理员一直依赖于向上扩展(scale up)-随着数据库负载的增加购买更大的数据库服务器―而不是向外扩展-随着负 ...
- android 程序中res/values-v14/styles.xml报错的解决办法
从旧的ADT迁移的新的ADT时, android 程序中res/values-v14/styles.xml报错: error: Error retrieving parent for item: No ...
- pl/sql 程序块里打印问题
declare v_number NUMBER; v_number2 NUMBER; begin select count(*) into v_number from dual; DBMS_OUTPU ...
- POJ2115 C Looooops(数论)
题目链接. 分析: 数论了解的还不算太多,解的时候,碰到了不小的麻烦. 设答案为x,n = (1<<k), 则 (A+C*x) % n == B 即 (A+C*x) ≡ B (mod n) ...

