应用程序菜单是应用程序用户界面中另外一个重要的组成部分。菜单为展现应用程序功能和设置提供了一个可靠的界面。按下设备上的 MENU 键会调出最普通的应用程序菜单。然而,你也可以加入当用户长按一个项目时调出的上下文菜单。
菜单也是用视图层次进行构架的,但你不必自己定义这个架构。你只要为你的 Activity定义 onCreateOptionsMenu() 和onCreateContextMenu() 回调方法,并声明你想要包含在菜单中处理的事务或者动作的代码即可。Android 将为你的菜单自动创建视图层次,并在其中绘入你的菜单项。
菜单会自行处理它们的事件,所以你不必为你菜单中的项目注册事件侦听器。当你菜单中 的 某 一 项 被 选 定 时 , 框 架 将 自 动 调 用 onOptionsItemSelected() 或onContextItemSelected()方法。如同应用程序布局一样。你也可以在一个 XML 文件中定义你菜单中的项目。
第一种利用MenuInflater
MenuInflater 是用来解析定义在menu 目录下的菜单布局文件的,使用MenuInflater 来生成菜单,你会发现是多么的爽朗,呵呵,我今天的小Demo,是定义四个菜单,并且实现了一个菜单事件。就是我们点击设置 (Setting )菜单,进入手机设置状态!下面看一下效果图(其实质还是用xml文件来生成menu):
下面是实现Demo 的详细步骤:
一、建立一个Android 工程我们命名为MenuInflaterDemo .
二、在res 目录下创建menu 目录,并且创建options_menu.xml (我们定义的菜单)文件,代码如下:
- view plaincopy to clipboardprint?
- <? xml version = "1.0" encoding = "utf-8" ?>
- < menu
- xmlns:android = "http://schemas.android.com/apk/res/android" >
- < item android:id = "@+id/menu_add"
- android:title = "Add"
- android:icon = "@android:drawable/ic_menu_add"
- />
- < item android:id = "@+id/menu_wallaper"
- android:title = "Wallpaper"
- android:icon = "@android:drawable/ic_menu_gallery"
- />
- < item android:id = "@+id/menu_search"
- android:title = "Search"
- android:icon = "@android:drawable/ic_search_category_default"
- />
- < item android:id = "@+id/menu_setting"
- android:title = "Settings"
- android:icon = "@android:drawable/ic_menu_preferences"
- />
- </ menu >
- <? xml version = "1.0" encoding = "utf-8" ?>
- < menu
- xmlns:android = "http://schemas.android.com/apk/res/android" >
- < item android:id = "@+id/menu_add"
- android:title = "Add"
- android:icon = "@android:drawable/ic_menu_add"
- />
- < item android:id = "@+id/menu_wallaper"
- android:title = "Wallpaper"
- android:icon = "@android:drawable/ic_menu_gallery"
- />
- < item android:id = "@+id/menu_search"
- android:title = "Search"
- android:icon = "@android:drawable/ic_search_category_default"
- />
- < item android:id = "@+id/menu_setting"
- android:title = "Settings"
- android:icon = "@android:drawable/ic_menu_preferences"
- />
- </ menu >
三、主类MenuInflaterDemo.java 的编码,这里写的代码很少哦,我这里只写了第四个菜单(Settings )的响应事件.全部代码如下:
第二种方法:利用代码动态实现menu,主要是menu.add方法
- view plaincopy to clipboardprint?
- package com.android.tutor;
- import android.app.Activity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.view.Menu;
- import android.view.MenuInflater;
- import android.view.MenuItem;
- public class MenuInflaterDemo extends Activity {
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super .onCreate(savedInstanceState);
- setContentView(R.layout.main);
- }
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- MenuInflater inflater = getMenuInflater();
- inflater.inflate(R.menu.options_menu, menu);
- return true ;
- }
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case R.id.menu_add:
- break ;
- case R.id.menu_wallaper:
- break ;
- case R.id.menu_search:
- break ;
- case R.id.menu_setting:
- showSettings();
- break ;
- }
- return super .onOptionsItemSelected(item);
- }
- private void showSettings(){
- final Intent settings = new Intent(android.provider.Settings.ACTION_SETTINGS);
- settings.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
- Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
- startActivity(settings);
- }
- }
1. 此程式開始執行後,按下menu就出現图示1的選單:
2.如果選取add item选项,画面标题title区显示出字串insert
3.再按下menu显示出选单,如果选取del item选项,标题title区显示出delete
4.再按下menu显示出选单,如果选取exit选项,程式就结束了
// ---- ex01.java 程式碼 ----
package com.misoo.ex01;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
public class ex01 extends Activity {
public static final int ADD_ID = Menu.FIRST;
public static final int DELETE_ID = Menu.FIRST + 1;
public static final int EXIT_ID = Menu.FIRST + 2;
@Override public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
}
@Override public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
menu.add(0, ADD_ID, 0, R.string.menu_add);
menu.add(0, DELETE_ID, 1, R.string.menu_delete);
menu.add(0, EXIT_ID, 2, R.string.menu_exit);
return true; }
@Override public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case ADD_ID: setTitle("Insert...");
break;
case DELETE_ID: setTitle("Delete...");
break;
case EXIT_ID:
finish();
break;
}
return super.onOptionsItemSelected(item);
}}
Step-3: 修改/res/values/strings.xml 的內容,更改為:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">ex01</string>
<string name="menu_add">Add Item</string>
<string name="menu_delete">Del Item</string>
<string name="menu_exit">Exit</string>
</resources>
並儲存之。
Step-4: 執行之。
综合两种建立menu的方法来建立一个两级菜单:
演示如何通过 Java 代码以及使用 XML 两种方式为应用程序添加菜单,菜单分为两级,一级菜单项目有“开始”“取消”、“关于......”“关于......”菜单下又有两个子菜单“帮助......”“联系我们......”
,、。其中一级菜单为 Java 代码生成,子菜单为通过 XML 定义。通过 XML 定义,需要在 res/menu 目录下创建一个名为 menu.xml 的文件,定义菜单项。具体过程如下:
创建工程。工程名为“MenuDemo”,Application name 为“菜单示例”
在 res/menu/目录下创建一个名为 menu.xml 的文件,内容如下:
<?xml version="1.0" encoding="utf-8"?>
<menu
xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/help"
android:title="帮助" />
<item
android:id="@+id/our"
android:title="联系我们" />
</menu>
说明:
该文件定义了一组共两个菜单项。
编写MenuActivity.java
package com.sharpandroid.menu;
import
import
import
import
import
android.app.Activity;
android.os.Bundle;
android.view.Menu;
android.view.MenuInflater;
android.view.MenuItem;
public class MenuActivity extends Activity {
private static final int OK = 1;
private static final int CANCLE = 2;
private static final int ABOUT = 3;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
@Override
//当点击Menu键时会打开菜单,当菜单第一次被打开始,框架回调该方法
public boolean onCreateOptionsMenu(Menu menu) {
//为菜单添加一个id为1,标题为”开始“的元素
menu.add(0, OK, 0, "开始");
menu.add(0, CANCLE, 0, "取消");
//为菜单添加一个子菜单,id为3,标题为”关于“,并返回该子菜单对象为file
Menu file = menu.addSubMenu(0, ABOUT, 0, " 关于");
//得到一个MenuInflater对象
MenuInflater inflater = getMenuInflater();
//调用inflater的inflate方法,获取资源文件中定义的元素,
//并将这些元素添加进指定的Menu——file
inflater.inflate(R.menu.submenubyxml, file);
return true;
}
@Override
//当一个菜单项被选中时,框架回调该方法,并将被点击的Item传入。
public boolean onOptionsItemSelected(MenuItem item) {
//根据被选中的Item进行不同的处理
switch (item.getItemId()) {
case OK:
this.setTitle("开始");
return true;
case CANCLE:
this.setTitle("取消");
return true;
case ABOUT:
this.setTitle("关于");
return true;
case R.id.help:
this.setTitle("帮助信息");
return true;
case R.id.our:
this.setTitle("联系我们");
return true;
}
return false;
}
}
说明:
本例中演示了如何通过 Java 代码创建菜单,并为其添加子菜单,以及如何通过 XML
文件定义菜单项,并在 Java 代码中获得信息之后添加到指定的菜单中。
综合了http://weizhulin.blog.51cto.com/1556324/311446以及大话企业级android开发以及36技