安卓常见的界面交互菜单
(1)常用的菜单:上下文菜单(contextmenu), 设项菜单(optionmenu),子菜单(submenu)..
- 选项菜单:最常规的菜单,android中把它叫做option menu ,一般点击设备的menu键来触发;
- 子菜单:android中点击子菜单将弹出悬浮窗口显示子菜单项。子菜单不支持嵌套,即子菜单中不能再包括其他子菜单。
- 上下文菜单:android中长按视图控件后出现的菜单,windows点击右键弹出的菜单即上下文菜单
- 图标菜单:这个比较简单,就是带icon的菜单项,需要注意的是子菜单项、上下文菜单项、扩展菜单项均无法显示图标。
- 选择菜单(alternative menu):用的比较少,以后单独介绍,本文先跳过
- 扩展菜单:选项菜单最多只能显示6个菜单项,超过6个时,第6个菜单项会被系统替换为一个叫“更多”的子菜单,原来显示不下的菜单项都作为“更多”菜单的子菜单项
(2)activity中代码手动的添加菜单
1 菜单项
需要定义好 菜单项(采用的是Menu.FIRST+N来标识一个菜单项) ,然后在activity中 oncreateoptionmenu onOptionsitemselected 方法,其他看需求:实例代码如下(PS更好的处理方式,应该是用资源文件来创建菜单)
public boolean onCreateOptionsMenu(Menu menu) { /* * * add()方法的四个参数,依次是: * 1、组别,如果不分组的话就写Menu.NONE, * 2、Id,这个很重要,Android根据这个Id来确定不同的菜单 * 3、顺序,那个菜单现在在前面由这个参数的大小 * 4、文本,菜单的显示文本 */ menu.add(1, Menu.FIRST + 1, 2, "删除").setIcon( android.R.drawable.ic_menu_delete); // setIcon()方法为菜单设置图标,这里使用的是系统自带的图标,同学们留意一下,以 // android.R开头的资源是系统提供的,我们自己提供的资源是以R开头的 menu.add(1, Menu.FIRST + 2, 2, "保存").setIcon(android.R.drawable.ic_menu_edit); 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, 3, "发送").setIcon(android.R.drawable.ic_menu_send); 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; } return false; } @Override public void onOptionsMenuClosed(Menu menu) { Toast.makeText(this, "选项菜单关闭了", Toast.LENGTH_LONG).show(); } @Override public boolean onPrepareOptionsMenu(Menu menu) { Toast.makeText(this, "选项菜单显示之前onPrepareOptionsMenu方法会被调用,你可以用此方法来根据打当时的情况调整菜单", Toast.LENGTH_LONG).show(); // 如果返回false,此方法就把用户点击menu的动作给消费了,onCreateOptionsMenu方法将不会被调用 return true; } /*
(2)上下文菜单
由于上下文菜单一般需要注册到视图的交互控件(PS 需要长按 被注册的控件才会出来),一般 则用户registerForContextMenu来注册,然后重新activity的onCreateContextMenu,和onContextMenuItemSelected()方法,其他看需求
//注册上下文菜单 View view = findViewById(R.id.textView1); registerForContextMenu(view);
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
// TODO Auto-generated method stub
// super.onCreateContextMenu(menu, v, menuInfo);
menu.add(Menu.NONE,Menu.FIRST,0,"菜单一").setIcon(R.drawable.ic_launcher);
menu.add(Menu.NONE,Menu.FIRST+1,1,"菜单2").setIcon(R.drawable.ic_launcher);
menu.add(Menu.NONE,Menu.FIRST+2,2,"菜单3").setIcon(R.drawable.ic_launcher);
menu.add(Menu.NONE,Menu.FIRST+3,3,"菜单4").setIcon(R.drawable.ic_launcher);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
// TODO Auto-generated method stub
// return super.onContextItemSelected(item);
switch( item.getItemId()){
case Menu.FIRST:
Toast.makeText(this, "你点击了菜单YI1", Toast.LENGTH_LONG).show();
break;
case Menu.FIRST+1:
Toast.makeText(this, "你点击了菜单2", Toast.LENGTH_LONG).show();
break;
case Menu.FIRST+2:
Toast.makeText(this, "你点击了菜3", Toast.LENGTH_LONG).show();
break;
case Menu.FIRST+3:
Toast.makeText(this, "你点击了菜单4", Toast.LENGTH_LONG).show();
break;
}
return true;
}
}
(3)子菜单
SubMenu 其实是在以上两种的菜单扩充: 如果是扩充选项菜单,则在oncreateoptionmenu 中调用 menu.addsubmenu()添加一个子菜单项,并返回该菜单项实例A,这样就可以将菜单项往A添加就行了,同类如果是扩充上下文菜单,同样的操作(ps 子菜单里面的菜单项没有不能设置icon的)实例代码
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// TODO Auto-generated method stub
SubMenu file = menu.addSubMenu("文件").setIcon(R.drawable.ic_launcher);
SubMenu operate = menu.addSubMenu("编辑").setIcon(R.drawable.ic_launcher);
menu.add(Menu.NONE,Menu.FIRST+3,0,"其他");
//子菜单添加菜单项 子菜单没有图标
file.add(Menu.NONE,Menu.FIRST,0,"打开");
file.add(Menu.NONE,Menu.FIRST+1,0,"保存");
operate.add(Menu.NONE,Menu.FIRST+2,0,"帮助");
return true;
// return super.onCreateOptionsMenu(menu);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
// TODO Auto-generated method stub
// super.onCreateContextMenu(menu, v, menuInfo);
menu.add(Menu.NONE,Menu.FIRST,0,"菜单一").setIcon(R.drawable.ic_launcher);
menu.add(Menu.NONE,Menu.FIRST+1,1,"菜单2").setIcon(R.drawable.ic_launcher);
menu.add(Menu.NONE,Menu.FIRST+2,2,"菜单3").setIcon(R.drawable.ic_launcher);
menu.add(Menu.NONE,Menu.FIRST+3,3,"菜单4").setIcon(R.drawable.ic_launcher);
SubMenu file = menu.addSubMenu("文件");
file.add(Menu.NONE,Menu.FIRST+4,4,"菜单5");
}
2016-03-27
浙公网安备 33010602011771号