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.网络存储 本文主要介绍如何使用文件来存储 ...
随机推荐
- Excel--java POi
import java.io.File; import java.io.FileOutputStream; import org.apache.commons.io.FileUtils; import ...
- IOS学习:常用第三方库(GDataXMLNode:xml解析库)
IOS学习:常用第三方库(GDataXMLNode:xml解析库) 解析 XML 通常有两种方式,DOM 和 SAX: DOM解析XML时,读入整个XML文档并构建一个驻留内存的树结构(节点树),通过 ...
- [转]Kafka/Metaq设计思想学习笔记
收集的一些kafka的信息: http://my.oschina.net/geecoodeer/blog/194829
- [Android] 输入系统(一)
Android输入系统是人与机器交互最主要的手段.我们通过按键或者触碰屏幕,会先经由linux产生中断,进行统一的处理过后,转换成Android能识别的事件信息,然后Android的输入系统去获取事件 ...
- Qt经典—线程、事件与Qobject(耳目一新)
介绍 You’re doing it wrong. — Bradley T. Hughes 线程是qt channel里最流行的讨论话题之一.许多人加入了讨论并询问如何解决他们在运行跨线程编程时所遇到 ...
- 14.1.1 使用InnoDB 表的好处:
14.1.1 Benefits of Using InnoDB Tables 14.1.2 Best Practices for InnoDB Tables 14.1.3 Checking InnoD ...
- 【HDOJ】1274 展开字符串
栈的应用,需要注意括号前可能没有数字的情况. #include <cstdio> #include <cstring> #include <cstdlib> #in ...
- -_-#【Canvas】
context.lineWidth = 0.5 incorrect display lineWidth=1 at html5 canvas canvas.save() canvas.restore() ...
- HDU 2444 The Accomodation of Students(判断是否可图 + 二分图)
题目大意:有一群人他们有一些关系,比如A认识B, B认识C, 但是这并不意味值A和C认识.现在给你所有互相认识的学生,你的任务是把所有的学生分成两个一组, 住在一个双人房里.相互认识的同学可以住在一个 ...
- HDOJ 1017 A Mathematical Curiosity
Problem Description Given two integers n and m, count the number of pairs of integers (a,b) such tha ...

