Android中的Menu
程序员文章站
2022-07-14 17:44:01
...
上下文菜单(通过在某元素上长按,来呼出菜单)
选项菜单(通过按手机上的菜单按钮,来呼出菜单)
重写 onCreateContextMenu 用以创建上下文菜单
重写 onContextItemSelected 用以响应上下文菜单
重写 onCreateOptionsMenu 用以创建选项菜单
重写 onOptionsItemSelected 用以响应选项菜单
当每次Menu显示时,会调用方法onPrepareOptionsMenu,也可以在菜单每次被调用时,对菜单中的项重新生成,通过重载onPrepareOptionsMenu来实现,由于每次调用时都要重新生成,对于那些不经常变化的菜单,效率就会比较低。
调用Menu.addSubMenu()方法,为某个菜单项添加子菜单
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
// 创建 R.id.txt1 的上下文菜单
if (v == (TextView) this.findViewById(R.id.txt1)) {
menu.setHeaderIcon(R.drawable.icon01); //设置菜单的图标
menu.setHeaderTitle("我是菜单"); //设置菜单的标题
// 用 ContextMenu.add() 来增加菜单项,返回值为 MenuItem
// 第一个参数:组ID
// 第二个参数:菜单项ID
即onContextItemSelected(MenuItem item)中item.getItemId
// 第三个参数:顺序号
// 第四个参数:菜单项上显示的内容
menu.add(1, 0, 0, "菜单1");
// MenuItem - 新增菜单项后的返回类型,针对菜单项的其他设置在此对象上操作
menu.add(1, 1, 1, "菜单2").setCheckable(true);
}
// 创建 R.id.txt2 的上下文菜单(多级上下文菜单)
else if (v == (TextView) this.findViewById(R.id.txt2)) {
// ContextMenu.addSubMenu("菜单名称") - 用来添加子菜单。子菜单其实就是一个特殊的菜单
SubMenu sub = menu.addSubMenu("父菜单1");
sub.setIcon(R.drawable.icon01);
sub.add(0, 0, 0, "菜单1");
sub.add(0, 1, 1, "菜单2");
sub.setGroupCheckable(1, true, true);
SubMenu sub2 = menu.addSubMenu("父菜单2");
sub2.setIcon(R.drawable.icon01);
sub2.add(1, 0, 0, "菜单3");
sub2.add(1, 1, 1, "菜单4");
sub2.setGroupCheckable(1, true, false);
}
}
Example:
自己运行加修改的例子
package com.example.firstandroid;
import android.app.Activity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
private final int MENU1 = 1;
private final int MENU2 = 2;
private final int MENU3 = 3;
private final int MENU4 = 4;
private final int MENU5 = 5;
private final int MENU6 = 6;
private final int MENU7 = 7;
private final int MENU8 = 8;
private final int MENU9 = 9;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/*
* TextView textView = new TextView(this);
* textView.setText("Hello Android World!");
*/
// setContentView(textView);
/*
* TextView v = (TextView)findViewById(R.id.txt); String text =
* getString(R.string.androidTxt); v.setText(text);
*/
// ((LinearLayout)findViewById(R.id.layout)).addView(textView);
TextView v1 = (TextView) findViewById(R.id.txt1);
TextView v2 = (TextView) findViewById(R.id.txt2);
TextView v3 = (TextView) findViewById(R.id.txt3);
registerForContextMenu(v1);
registerForContextMenu(v2);
registerForContextMenu(v3);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId()) {
case 1:case 2: case 3: case 4:case 5:
case 6:case 7: case 8: case 9:
Toast.makeText(this, "你选择的是 "+item.getTitle()+ " 菜单", Toast.LENGTH_SHORT).show();
break;
default://对没有处理的事件,交给父类来处理
return super.onContextItemSelected(item);
}
return super.onContextItemSelected(item);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
// TODO Auto-generated method stub
super.onCreateContextMenu(menu, v, menuInfo);
menu.setHeaderIcon(R.drawable.ic_action_search);
// 父菜单图标
switch (v.getId()) {
case R.id.txt1:
menu.setHeaderTitle("我是菜单");
menu.add(0, MENU1, 0, "菜单1");
menu.add(0, MENU2, 1, "菜单2");
menu.add(0, MENU3, 2, "菜单3").setCheckable(true);
break;
case R.id.txt2:
SubMenu s1 = menu.addSubMenu("父菜单1");
s1.setIcon(R.drawable.ic_action_search);
//貌似没啥作用
s1.add(0, 0, 0, "菜单1");
s1.add(0, 1, 1, "菜单2");
s1.add(0, 2, 2, "菜单3");
SubMenu s2 = menu.addSubMenu("父菜单2");
s2.setHeaderIcon(R.drawable.setting);
s2.add(1, 0, 0, "菜单3");
s2.add(1, 1, 1, "菜单4");
s2.add(1, 2, 2, "菜单5");
SubMenu s3 = menu.addSubMenu("父菜单3"); //会显示,但没有子菜单
break;
case R.id.txt3:
//1、通过xml文件来添加菜单
//getMenuInflater().inflate(R.menu.activity_main, menu);
menu.setHeaderTitle("联系人操作");
menu.add(1,MENU1,1,"呼叫").setIcon(R.drawable.setting);
menu.add(1,MENU2,2, "清除记录").setIcon(R.drawable.setting);
menu.add(1,MENU3,3,"切换到Q信").setIcon(R.drawable.setting).setEnabled(false);
//menu.add(2,MENU_Q,3,"切换到Q信").setIcon(R.drawable.setting).setEnabled(false);
menu.add(2,MENU4,4,"加入黑名单").setIcon(R.drawable.setting);
menu.add(2,MENU5,5,"加入白名单").setIcon(R.drawable.setting);
SubMenu subMenu = menu.addSubMenu(2, MENU6, 6, "系统设置").setIcon(R.drawable.setting);
subMenu.add(1, MENU7, 2, "网络设置");
subMenu.add(1, MENU8, 3, "高级设置");
subMenu.add(1, MENU9, 4, "安全设置");
}
}
//二、选项菜单
private static final int MENU_CALL = Menu.FIRST; //1
private static final int MENU_DELETE = Menu.FIRST+1;
private static final int MENU_Q = Menu.FIRST+2;
private static final int MENU_BLACK_LIST = Menu.FIRST+3;
private static final int MENU_WHITE_LIST = Menu.FIRST+4;
/** 只有当Menu菜单首次被显示时会调用此方法 */
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
//1、通过xml文件来添加菜单
//getMenuInflater().inflate(R.menu.activity_main, menu);
//2、通过手动添加来配置上下文菜单选项
menu.add(1,MENU_CALL,1,"呼叫").setIcon(R.drawable.setting);
menu.add(1,MENU_DELETE,2, "清除记录").setIcon(R.drawable.setting);
menu.add(2,MENU_Q,3,"切换到Q信").setIcon(R.drawable.setting).setEnabled(false);
menu.add(2,MENU_BLACK_LIST,4,"加入黑名单").setIcon(R.drawable.setting);
menu.add(2,MENU_WHITE_LIST,5,"加入白名单").setIcon(R.drawable.setting);
SubMenu subMenu = menu.addSubMenu(2, MENU6, 6, "系统设置").setIcon(R.drawable.setting);
subMenu.add(1, MENU7, 2, "网络设置");
subMenu.add(1, MENU8, 3, "高级设置");
subMenu.add(1, MENU9, 4, "安全设置");
// 如果希望显示菜单,请返回true
return true;
}
@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
switch (item.getItemId()) {
//XML方式
/*case R.id.id_call:
Toast.makeText(this, "你选择的是 呼叫 菜单", Toast.LENGTH_LONG).show();
break;
case R.id.id_delete:
case R.id.id_himsg:
case R.id.id_black:
case R.id.id_white:
Toast.makeText(getApplicationContext(), "你选择的是 "+item.getTitle()+ " 菜单", Toast.LENGTH_SHORT).show();
break; */
//addMenu方式,使用case 1: ...
case 1:case 2:case 3: case 4:case 5:
Toast.makeText(getApplicationContext(), "你选择的是 "+item.getTitle()+ " 菜单", Toast.LENGTH_SHORT).show();
break;
default://对没有处理的事件,交给父类来处理
return super.onMenuItemSelected(featureId, item);
}
//返回true表示处理完菜单项的事件,不需要将该事件继续传播下去了
return super.onMenuItemSelected(featureId, item);
}
/** 当每次Menu显示时,会调用此方法*/
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
// TODO Auto-generated method stub
return super.onPrepareOptionsMenu(menu);
}
}
选项菜单:
其中的系统设置:
上下文菜单:
第一个:
第二个: