您的位置:首页 > 移动开发 > Android开发

android menu学习笔记

2013-05-12 00:48 411 查看
android的菜单有两种,第一种是设备自带的menu菜单,第二种是长按某个组件的时候弹出的上下文菜单(类似于右键菜单)

一、手机菜单Menu

要手动创建Menu,不需要像其他组件一样去画界面,

只需要重写public boolean onCreateOptionsMenu(Menu menu)方法

如果要监听 则需要重写public boolean onOptionsItemSelected(MenuItem item)

android默认规定menu菜单不能超过6个,否则的话就会在第六个按钮显示更多。



直接上代码

public boolean onCreateOptionsMenu(Menu menu){

  SubMenu engryMenu = menu.addSubMenu("愤怒");
// 设置菜单图标
engryMenu.setIcon(R.drawable.angrybirds);
// 设置菜单打开后选项的图标
// hobbyMenu.setHeaderIcon(icon)
// 设置菜单打开后选项的标题
engryMenu.setHeaderTitle("愤怒的小鸟");
// groupId,itemId,orderId
engryMenu.add(0, bird1, 1, "bird1");
engryMenu.add(0, bird2, 2, "bird1");
SubMenu earlyMenu = menu.addSubMenu(0, 5, 1, "喜悦");
earlyMenu.setIcon(R.drawable.earlybird);
earlyMenu.setHeaderTitle("喜悦的小鸟");
earlyMenu.add(0, bird3, 1, "bird3");
earlyMenu.add(0, bird4, 2, "bird4");
}


监听事件

private final int bird1 = 1;
private final int bird2 = 2;
private final int bird3 = 3;
private final int bird4 = 4;
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub

int id = item.getItemId();

switch (id) {
case bird1:
Toast.makeText(getApplication(), "bird1", 1).show();
break;
case bird2:

break;
case bird3:

break;
case bird4:

break;
case 5:
Toast.makeText(getApplication(), "喜悦主菜单被选中", 1).show();
break;

default:
break;
}

return super.onOptionsItemSelected(item);
}


menu还提供了XML方式的静态方式

我们在res目录下创建一个menu类型的XML

<menu
xmlns:android="http://schemas.android.com/apk/res/android">

<group android:id="@+id/staticGroup">
<item android:id="@+id/staticMenu" android:title="menu1"></item>
<item android:title="menu1"></item>
</group>
</menu>


@Override
public boolean onCreateOptionsMenu(Menu menu) {
// TODO Auto-generated method stub

MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.static_menu, menu);

return super.onCreateOptionsMenu(menu);
}




二、上下文菜单(右键菜单)

上下文菜单是在我们为某个组件注册了registerForContextMenu方法之后,当我们长按该组件时候

触发弹出上下文菜单(右键菜单是不是更形象?O(∩_∩)O)

与上述提到的Menu菜单类似,上下文菜单同样也是通过一个方法(onCreateContextMenu)创建,一个方法来监听(onContextItemSelected)所不用的是他还需要registerForContextMenu某个组件

@Override
public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);
setContentView(R.layout.context_menu);
mTvMenu = (TextView) findViewById(R.id.tv_menu);
// 注册 上下文菜单
registerForContextMenu(mTvMenu);

}

@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
// TODO Auto-generated method stub
super.onCreateContextMenu(menu, v, menuInfo);
menu.setHeaderTitle("上下文菜单");
menu.add("发送");
menu.add("保存");
menu.add("分享");
menu.add("复制");

}

@Override
public boolean onContextItemSelected(MenuItem item) {
// TODO Auto-generated method stub
return super.onContextItemSelected(item);
}




如果你对上下文菜单的机制有更进一步了解,可以移步这里http://www.cnblogs.com/codingmyworld/archive/2011/08/27/2155521.html

对静态XML配置的话,则移步这里
http://www.cnblogs.com/codingmyworld/archive/2011/08/28/2155594.html

三、动态生成菜单

有时候我们需要根据实际情况来生成不同的menu,比如现在有两个按钮menu1和menu2.

我希望点击menu1的时候menu菜单只有menu1,而当点击了menu2的时候menu只会有menu2

要实现这个功能,我们必须要了解另外一个非常重要的方法onPrepareOptionsMenu()

这个方法跟onCreateOptionsMenu的区别在于

onCreateOptionsMenu只会在第一次出发menu的时候才会调用

而onPrepareOptionsMenu是每次点击menu菜单的时候都会触发

为了避免onPrepareOptionsMenu中创建的menu跟onCreateOptionsMenu中创建的menu冲突

可以在onPrepareOptionsMenu的最上头加上一句menu.clear。

不多说直接上代码

private Button bt_menu1;
private Button bt_menu2;
private int choose=0;

@Override
public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.menu);

bt_menu1 = (Button) findViewById(R.id.bt_menu1);
bt_menu2 = (Button) findViewById(R.id.bt_menu2);

bt_menu1.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
choose=0;
openOptionsMenu();

}
});
bt_menu2.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
choose=1;
openOptionsMenu();

}
});

}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
// TODO Auto-generated method stub

// 清空 否则onCreateOptionsMenu()中的会叠加
menu.clear();
// 假设我们有两个按钮都
if(choose==0){
menu.add("menu1");

}else{
menu.add("menu2");

}

return super.onPrepareOptionsMenu(menu);

}


在按钮中如何触发menu事件,可以通过openOptionsMenu这个方法来完成

或则可以通过模拟按钮来实现

String keyCommand = "input keyevent " + KeyEvent.KEYCODE_MENU;
Runtime runtime = Runtime.getRuntime();
Process proc = runtime.exec(keyCommand);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: