android menu学习笔记
2013-05-12 00:48
411 查看
android的菜单有两种,第一种是设备自带的menu菜单,第二种是长按某个组件的时候弹出的上下文菜单(类似于右键菜单)
只需要重写public boolean onCreateOptionsMenu(Menu menu)方法
如果要监听 则需要重写public boolean onOptionsItemSelected(MenuItem item)
android默认规定menu菜单不能超过6个,否则的话就会在第六个按钮显示更多。
直接上代码
监听事件
触发弹出上下文菜单(右键菜单是不是更形象?O(∩_∩)O)
与上述提到的Menu菜单类似,上下文菜单同样也是通过一个方法(onCreateContextMenu)创建,一个方法来监听(onContextItemSelected)所不用的是他还需要registerForContextMenu某个组件
如果你对上下文菜单的机制有更进一步了解,可以移步这里http://www.cnblogs.com/codingmyworld/archive/2011/08/27/2155521.html
对静态XML配置的话,则移步这里
http://www.cnblogs.com/codingmyworld/archive/2011/08/28/2155594.html
我希望点击menu1的时候menu菜单只有menu1,而当点击了menu2的时候menu只会有menu2
要实现这个功能,我们必须要了解另外一个非常重要的方法onPrepareOptionsMenu()
这个方法跟onCreateOptionsMenu的区别在于
onCreateOptionsMenu只会在第一次出发menu的时候才会调用
而onPrepareOptionsMenu是每次点击menu菜单的时候都会触发
为了避免onPrepareOptionsMenu中创建的menu跟onCreateOptionsMenu中创建的menu冲突
可以在onPrepareOptionsMenu的最上头加上一句menu.clear。
不多说直接上代码
在按钮中如何触发menu事件,可以通过openOptionsMenu这个方法来完成
或则可以通过模拟按钮来实现
一、手机菜单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);
相关文章推荐
- Android 学习笔记16:Menu 和 action bar
- Android(java)学习笔记196:Android中Menu的使用(静态和动态)
- Android 基础学习笔记之- Menu的用法
- Android 学习笔记(二七):Menu
- Android 学习笔记(二七):Menu
- Android 学习笔记(二七):Menu
- Android 学习笔记2 MENU
- Android 学习笔记(二七):Menu
- Android 学习笔记(二七):Menu
- 笔记60 | Android控制音量与音频播放的学习
- Android开发学习笔记:浅谈Toast
- android 开发零起步学习笔记(一):安装Android Studio2.0
- android 开发零起步学习笔记(四):学习几个原来没接触的概念之Jcenter
- 安卓学习笔记---Android 手势监听学习总结
- [学习笔记]android的onCreate和Button的使用
- Android动画用到的基本的属性和学习笔记
- android菜鸟学习笔记29----Android应用向用户发送提示信息的方式总结
- [Android]学习笔记之布局
- Android 学习笔记3(Activity之间参数传递)
- Android开发学习笔记:浅谈WebView