菜单Menu
在Android中,所有的菜单创建方法都由Activity类本身提供。Android系统中一共有3种菜单:选项菜单(ptionsMenu)、上下文菜单(ContextMenu)和子菜单(SubMenu),下面分别介绍。
一、选项菜单(OptionsMenu)
选项菜单是一种最常用也是最基本的菜单,通过覆写android.app.Activity为在几个方法即可实现。这些方法有:
(1)设置多个菜单项(MenuItem),如果返回true,表示显示菜单,反之则不显示:
Public booleanonCreateOptionsMenu(Menu menu)
(2)判断菜单项的操作:public boolean onOptionsItemSelected(MenuItemitem)
(3)当菜单关闭时触发此操作:public void onOptionsMenuClose(Menu menu)
(4)在菜单显示前触发此操作,如果返回true,则继续调用onCreateOptionsMenu()方法,反之不调用:public BooleanonPrepareOptionsMenu(Menu menu)
例 1 程序运行效果截图
实现过程:
1. 编写main.xml布局管理器
xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#00ff00">
<TextView
android:id="@+id/textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按下键盘上的 Menu 键将会出现选择菜单,快试试吧..."/>
LinearLayout>
2. 编写MainActivity程序
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu){
//super.getMenuInflater().inflate(R.menu.main_menu, menu);
menu.add(Menu.NONE, Menu.FIRST + 1, 5, "删除")
.setIcon(android.R.drawable.ic_menu_delete);
menu.add(Menu.NONE, Menu.FIRST + 2, 2, "保存")
.setIcon(android.R.drawable.ic_menu_save);
menu.add(Menu.NONE, Menu.FIRST + 3, 6, "帮助")
.setIcon(android.R.drawable.ic_menu_help);
menu.add(Menu.NONE, Menu.FIRST + 4, 1, "添加")
.setIcon(android.R.drawable.ic_menu_add);
menu.add(Menu.NONE, Menu.FIRST + 5, 4, "详细")
.setIcon(android.R.drawable.ic_menu_info_details);
menu.add(Menu.NONE, Menu.FIRST + 6, 7, "发送")
.setIcon(android.R.drawable.ic_menu_send);
menu.add(Menu.NONE, Menu.FIRST + 7, 3, "编辑")
.setIcon(android.R.drawable.ic_menu_edit);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item){
switch(item.getItemId()){
case Menu.FIRST + 1:
Toast.makeText(this, "你选择了“添加菜单”项", Toast.LENGTH_LONG).show();
break;
case Menu.FIRST + 2:
Toast.makeText(this, "你选择了“保存菜单”项", Toast.LENGTH_LONG).show();
break;
case Menu.FIRST + 3:
Toast.makeText(this, "你选择了“编辑菜单”项", Toast.LENGTH_LONG).show();
break;
case Menu.FIRST + 4:
Toast.makeText(this, "你选择了“详细菜单”项", Toast.LENGTH_LONG).show();
break;
case Menu.FIRST + 5:
Toast.makeText(this, "你选择了“删除菜单”项", Toast.LENGTH_LONG).show();
break;
case Menu.FIRST + 6:
Toast.makeText(this, "你选择了“发送菜单”项", Toast.LENGTH_LONG).show();
break;
case Menu.FIRST + 7:
Toast.makeText(this, "你选择了“帮助菜单”项", Toast.LENGTH_LONG).show();
break;
}
return false;
}
@Override
public void onOptionsMenuClosed(Menu menu){
Toast.makeText(this, "选择菜单关闭了", Toast.LENGTH_LONG).show();
}
@Override
public boolean onPrepareOptionsMenu(Menu menu){
Toast.makeText(this, "在菜单显示(onCreateOptionsMenu())之前系统会调用此操作,可以" +
"在此操作中完成一些处理操作。)",
Toast.LENGTH_LONG).show();
return true;
}
}
此程序中直接通过onCreateOptionsmenu()方法在菜单中增加了多个菜单项,在应用中也可以通过配置资源文件的方式设置所有的菜单项,可在res文件夹中建立单项的配置文件。建立res\menu\menu.xml文件配置菜单项:
<menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/item_1" android:title="添加" android:icon="@android:drawable/ic_menu_add"/> <item android:id="@+id/item_2" android:title="保存" android:icon="@android:drawable/ic_menu_save"/> <item android:id="@+id/item_3" android:title="编辑" android:icon="@android:drawable/ic_menu_edit"/> <item android:id="@+id/item_4" android:title="详细" android:icon="@android:drawable/ic_menu_info_details"/> <item android:id="@+id/item_5" android:title="删除" android:icon="@android:drawable/ic_menu_delete"/> <item android:id="@+id/item_6" android:title="帮助" android:icon="@android:drawable/ic_menu_send"/> <item android:id="@+id/item_7" android:title="发送" android:icon="@android:drawable/ic_menu_help"/> menu>
在此配置文件中通过<item>元素定义了多个菜单项,要从此配置文件中取出数据,就要修改onCreateOptionsMenu(),利用super.getMenuInfalter().inflater()方法加载menu.xml配置文件中的菜单信息,修改后的代码如下:
Public Boolean onCreateOptionsMenu(Menu menu){ //显示菜单
super.getMenuInflater().inflate(R.menu.menu, menu); //填充菜单项
return true;
}
二、上下文菜单ContextMenu
上下文菜单类似于Windows中的右键菜单的操作形式,在android中,在一个列表显示(ListView)操作时,用户可以通过长按操作打开某些操作的菜单,这种菜单就是上下文菜单。要进行上下文菜单的操作,需要在Activity程序中覆写如下方法:
(1) public void onCreateContextMenu(ContextMenu menu, View view,
ContextMenu.ContextMenuInfo menuInfo):在此方法中可以设置要显示的菜单项;
(2)public boolean onContextItemSelected(MenuItemitem):当某个菜单项被选中时,触发此操作;
(3)public void onContextMenuClosed(Menu menu):当菜单项关闭时触发此操作。
例 2 程序运行效果截图
实现过程:
1.直接编写MainActivity程序
[java] view plain copy print ?
- import android.app.Activity;
- import android.os.Bundle;
- import android.view.ContextMenu;
- import android.view.Menu;
- import android.view.MenuItem;
- import android.view.View;
- import android.widget.ArrayAdapter;
- import android.widget.ListView;
- import android.widget.Toast;
- public class MainActivity extends Activity {
- private String data[] = { "狂人日记" , "bolg.csdn.net/runninglion" ,
- "作者:lion" , "欢迎进入本博客" , "感谢:www.csdn.net" };
- private ListView listView;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super .onCreate(savedInstanceState);
- listView = new ListView( this ); //实例化组件
- listView.setAdapter( new ArrayAdapter<String>( this , //将数据包装
- android.R.layout.simple_expandable_list_item_1, //每行显示一条数据
- data)); //设置组件内容
- super .setContentView(listView); //将组件添加到屏幕中
- super .registerForContextMenu(listView); //添加上下文菜单
- }
- @Override
- public void onCreateContextMenu(ContextMenu menu, View view,
- ContextMenu.ContextMenuInfo menuInfo){
- super .onCreateContextMenu(menu, view, menuInfo);
- menu.setHeaderTitle( "信息操作" );
- menu.add(Menu.NONE, Menu.FIRST + 1 , 1 , "添加联系人" );
- menu.add(Menu.NONE, Menu.FIRST + 2 , 2 , "查看详情" );
- menu.add(Menu.NONE, Menu.FIRST + 3 , 3 , "删除信息" );
- menu.add(Menu.NONE, Menu.FIRST + 4 , 4 , "另存为" );
- menu.add(Menu.NONE, Menu.FIRST + 5 , 5 , "编辑" );
- }
- @Override
- public boolean onContextItemSelected(MenuItem item){
- switch (item.getItemId()){
- case Menu.FIRST + 1 :
- Toast.makeText( this , "你选择了“添加联系人”项" , Toast.LENGTH_LONG).show();
- break ;
- case Menu.FIRST + 2 :
- Toast.makeText( this , "你选择了“查看详情”项" , Toast.LENGTH_LONG).show();
- break ;
- case Menu.FIRST + 3 :
- Toast.makeText( this , "你选择了“删除信息”项" , Toast.LENGTH_LONG).show();
- break ;
- case Menu.FIRST + 4 :
- Toast.makeText( this , "你选择了“另存为”项" , Toast.LENGTH_LONG).show();
- break ;
- case Menu.FIRST + 5 :
- Toast.makeText( this , "你选择了“编辑”项" , Toast.LENGTH_LONG).show();
- break ;
- }
- return false ;
- }
- @Override
- public void onContextMenuClosed(Menu menu){
- Toast.makeText( this , "上下文菜单关闭了" , Toast.LENGTH_LONG).show();
- }
- }
也可以像例 1 一样通过配置资源文件来得到想要显示的菜单项。
三、子菜单SubMenu
可以为每一个菜单定义多个子菜单(SubMenu),子菜单的创建依然要通过Activity类中的onCreateOptionsMenu()方法完成。
例 3 程序运行效果截图
实现过程:
1. 直接编写MainActivity程序
[java] view plain copy print ?
- import android.app.Activity;
- import android.view.Menu;
- import android.view.MenuItem;
- import android.view.SubMenu;
- import android.widget.Toast;
- public class MainActivity extends Activity {
- @Override
- public boolean onCreateOptionsMenu(Menu menu){
- SubMenu filemenu = menu.addSubMenu( "文件" );
- SubMenu editmenu = menu.addSubMenu( "编辑" );
- filemenu.add(Menu.NONE, Menu.FIRST + 1 , 1 , "新建" );
- filemenu.add(Menu.NONE, Menu.FIRST + 2 , 2 , "打开" );
- filemenu.add(Menu.NONE, Menu.FIRST + 3 , 3 , "保存" );
- editmenu.add(Menu.NONE, Menu.FIRST + 4 , 4 , "撤销" );
- editmenu.add(Menu.NONE, Menu.FIRST + 5 , 5 , "恢复" );
- return true ;
- }
- @Override
- public boolean onOptionsItemSelected(MenuItem item){
- switch (item.getItemId()){
- case Menu.FIRST + 1 :
- Toast.makeText( this , "你选择了“新建”项" , Toast.LENGTH_LONG).show();
- break ;
- case Menu.FIRST + 2 :
- Toast.makeText( this , "你选择了“打开”项" , Toast.LENGTH_LONG).show();
- break ;
- case Menu.FIRST + 3 :
- Toast.makeText( this , "你选择了“保存”项" , Toast.LENGTH_LONG).show();
- break ;
- case Menu.FIRST + 4 :
- Toast.makeText( this , "你选择了“撤销”项" , Toast.LENGTH_LONG).show();
- break ;
- case Menu.FIRST + 5 :
- Toast.makeText( this , "你选择了“恢复”项" , Toast.LENGTH_LONG).show();
- break ;
- }
- return false ;
- }
- }
也可以像例 1 一样通过配置资源文件来得到想要显示的子菜单项。