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. Excel--java POi

    import java.io.File; import java.io.FileOutputStream; import org.apache.commons.io.FileUtils; import ...

  2. IOS学习:常用第三方库(GDataXMLNode:xml解析库)

    IOS学习:常用第三方库(GDataXMLNode:xml解析库) 解析 XML 通常有两种方式,DOM 和 SAX: DOM解析XML时,读入整个XML文档并构建一个驻留内存的树结构(节点树),通过 ...

  3. [转]Kafka/Metaq设计思想学习笔记

    收集的一些kafka的信息: http://my.oschina.net/geecoodeer/blog/194829

  4. [Android] 输入系统(一)

    Android输入系统是人与机器交互最主要的手段.我们通过按键或者触碰屏幕,会先经由linux产生中断,进行统一的处理过后,转换成Android能识别的事件信息,然后Android的输入系统去获取事件 ...

  5. Qt经典—线程、事件与Qobject(耳目一新)

    介绍 You’re doing it wrong. — Bradley T. Hughes 线程是qt channel里最流行的讨论话题之一.许多人加入了讨论并询问如何解决他们在运行跨线程编程时所遇到 ...

  6. 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 ...

  7. 【HDOJ】1274 展开字符串

    栈的应用,需要注意括号前可能没有数字的情况. #include <cstdio> #include <cstring> #include <cstdlib> #in ...

  8. -_-#【Canvas】

    context.lineWidth = 0.5 incorrect display lineWidth=1 at html5 canvas canvas.save() canvas.restore() ...

  9. HDU 2444 The Accomodation of Students(判断是否可图 + 二分图)

    题目大意:有一群人他们有一些关系,比如A认识B, B认识C, 但是这并不意味值A和C认识.现在给你所有互相认识的学生,你的任务是把所有的学生分成两个一组, 住在一个双人房里.相互认识的同学可以住在一个 ...

  10. HDOJ 1017 A Mathematical Curiosity

    Problem Description Given two integers n and m, count the number of pairs of integers (a,b) such tha ...