Android中的Menu分为三种,分别为:OptionsMenu(选项菜单)、ContextMenu(上下文菜单)、SubMenu(子菜单)。

1、OptionsMenu

  按Menu键就会显示,用于当前的Activity。
  在Activity里面,一般通过以下函数来使用options menu:
     Activity::onCreateOptionsMenu (Menu menu)   创建options menu,这个函数只会在menu第一次显示时调用。
     Activity::onPrepareOptionsMenu (Menu menu)  更新改变options menu的内容,这个函数会在menu每次显示时调用。
     Activity::onOptionsItemSelected (MenuItem item) 处理选中的菜单项。
      //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:

  Activity::registerForContextMenu(View view) 为某个view注册context menu,一般在Activity::onCreate里面调用。
  Activity::onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) 创建context menu,和options menu不同,context meun每次显示时都会调用这个函数。
  Activity::onContextItemSelected(MenuItem item) 处理选中的菜单项。
         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的使用的更多相关文章

  1. Android 开发手记一NDK编程实例

    在Android上,应用程序的开发,大部分基于Java语言来实现.要使用c或是c++的程序或库,就需要使用NDK来实现.NDK是Native Development Kit的简称.它是一个工具集,集成 ...

  2. Android开发手记(28) Handler和Looper

    Android的消息处理有三个核心类:Looper,Handler和Message.其实还有一个Message Queue(消息队列),但是MQ被封装到Looper里面了,我们不会直接与MQ打交道.平 ...

  3. Android开发手记(24) Log的使用及颜色的更改

    在程序开发过程中,LOG是广泛使用的用来记录程序执行过程的机制,它既可以用于程序调试,也可以用于产品运营中的事件记录.在Android系统中,提供了简单.便利的LOG机制,开发人员可以方便地使用.本文 ...

  4. Android开发手记(7) 按钮类控件的使用

    1.点击Button改变页面背景色 通过Button改变页面背景色,首先新建相应的对象,让后绑定到Layout上的元素. final RelativeLayout layout = (Relative ...

  5. [Android开发常见问题-12] Android开发中debug.keystore如何使用。

    有些团度在开发较大的项目的时候会用到debug.keystore这种debug签名,那么这个东西怎么用呢?之前在导出签名包的时候只需要android tools -> export signed ...

  6. Android开发中的menu菜单

    复写onCreateOptionsMenu方法,当点击menu菜单时,调用该方法. @Override public boolean onCreateOptionsMenu(Menu menu) { ...

  7. Android开发手记(22) 传感器的使用

    Android的传感器主要包括八大传感器,他们分别是:加速度传感器(accelerometer).陀螺仪(gyroscope).方向传感器(orientation).磁力传感器(magnetic fi ...

  8. Android开发手记(18) 数据存储三 SQLite存储数据

    Android为数据存储提供了五种方式: 1.SharedPreferences 2.文件存储 3.SQLite数据库 4.ContentProvider 5.网络存储 SQLite 是以嵌入式为目的 ...

  9. Android开发手记(17) 数据存储二 文件存储数据

    Android为数据存储提供了五种方式: 1.SharedPreferences 2.文件存储 3.SQLite数据库 4.ContentProvider 5.网络存储 本文主要介绍如何使用文件来存储 ...

随机推荐

  1. Llinux-apache安装

    第四章  构建LAMP网站服务平台 实验报告 1.安装apache服务器软件及相关组件 查看系统中是否安装apache服务相关的软件包: [root@www /]# rpm -qa | grep ht ...

  2. 【转】火火火火火!看HomeKit如何改变物联网和智能家居?

    摘要: 智能家居并非新概念,然而在苹果等巨头插足之前,它却只是一盘散沙,各自为营,苹果又将如何凭借HomeKit构建起拥有统一界面和控制中心的平台来实现各种智能家居设备与应用之间的无缝连接,真正实现智 ...

  3. sql 语句左连接右连接小例子

    A表(a1,b1,c1) B表(a2,b2) a1 b1 c1 a2 b2 01 数学 95 01 张三 02 语文 90 02 李四 03 英语 80 04 王五 select A.*,B.* fr ...

  4. php in_array比较原理和类型比较问题

    in_array 是PHP 的检查数组中是否存在某个值 的函数,里面有三个参数 bool in_array ( mixed $needle , array $haystack [, bool $str ...

  5. 使用UIImagePickerController时3DTouch引起Crash

    一.crash的场景 程序中用到UIImagePickerController时,如果在IPhone6S上运行APP,当forceTouch 一个图片时程序会crash,并附带如下crash mess ...

  6. infinitescroll 通过无限制分页(json方式完整代码)

    @{ ViewBag.Title = " ";} <style type="text/css"> #infscr-loading { text-al ...

  7. SQLite for xamarin

    原文地址:http://www.codeproject.com/Articles/1097179/SQLite-with-Xamarin-Forms-Step-by-Step-guide SQLite ...

  8. POJ1260 Pearls(dp,矩阵链乘法)

    题目链接. 题目大意: 给定一个n,和两个序列a[i], p[i]. a[i] 表示需要购买 i品质 的数量,p[i] i 等级的价格. 1.每个品质都会有不同的价格,价格依据品质上升而上升 2.买一 ...

  9. 用SQL求1到N的质数和

    今天在百度知道中,遇到了一位朋友求助:利用sql求1到1000的质数和.再说今天周五下午比较悠闲,我就在MSSQL 2008中写了出来,现在分享在博客中,下面直接贴代码: declare @num i ...

  10. 局部更新 java web 的文件

    方法一:直接更新文件 直接修改部署后的文件.比如用 maven 打包成 WAR 文件,部署(复制)到 Tomcat/webapps 目录后,Tomcat 会立即将 WAR 文件解压成目录结构.此时,只 ...