分类:
- Options Menu
- Context Menu
- PopupMenu
一、Options Menu:
特点以及作用:
- 当点击Menu键或者标题栏右上方的 图标时,在页面右上方或者页面的底边缘(很老的手机上)的列表就是Options Menu的菜单列表(有时候菜单列表中的item选项也可直接显示在标题栏上)
使用方式:
1. 在res—menu文件夹内创建xml文件,以menu作为根标签.
2. 在xml文件中添加item标签,每一个item标签的作用为:在菜单列表中添加可点击内容
<!--
android:id 设置唯一标识,可在后期用于判断点击事件
android:title 设置item中显示的文字
android:orderInCategory 用于设置多个item之间的排列优先级,数字越小的排列顺序越靠前
android:showAsAction 控制item的显示方式(直接显示溢出菜单中还是直接显示在标题栏上)
可选属性值:ifRoom 如果标题栏上有足够的控件,就将该item直接显示在标题栏上,如果没有,就显示溢出菜单列表中
always 不管标题栏有没有剩余空间,都会将item直接显示在标题栏上
withText 最好配合always进行使用,当item直接显示在标题栏上时,是否可以同时显示文本和图标
备注:1. 显示在溢出菜单列表中的item无法显示图标
2. withText效果不是百分百生效,关键看手机
-->
<item
android:id="@+id/item1"
android:icon="@drawable/ic_launcher"
android:orderInCategory="1000"
android:showAsAction="always|withText"
android:title="新建"/>
<item
android:id="@+id/item2"
android:orderInCategory="10"
android:title="删除"/>
3.Xml文件处理完毕后,在代码中添加重写方法:
/*
* 参数:menu对象, 用于控制菜单列表显示的菜单对象
* 返回值:控制menu是否显示,
* 即当返回值为false时,菜单不显示
* */
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// TODO Auto-generated method stub
//解析mymenu中的内容,将mymenu中的所item添加到参数二指定的menu对象中显示
getMenuInflater().inflate(R.menu.mymenu, menu);
需要设置菜单item选项的点击事件时:
//当menu菜单中的item被点击时,运行此方法
//参数:代表的就是被点击的item对象
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
//getTitle方法用于获取item标签中title属性的值
Toast.makeText(this, "被点击的item对应的title为: "+item.getTitle(), Toast.LENGTH_SHORT).show();
//getItemId方法用于获取item标签中id属性的值
switch (item.getItemId()) {
case R.id.item1:
//被点击的是item1 新建选项
break;
case R.id.item2:
//被点击的是item2 删除选项
break;
case R.id.item3_child1:
//点击的是item3中的子选项1
break;
}
return super.onOptionsItemSelected(item);
}
当需要添加含有子选项的item时:
<!-- 用于设置含有二级菜单的选项,即点击该选项后,菜单会自动关闭,并且会弹出新的菜单列表 -->
<item
android:id="@+id/item3"
android:title="拥有子选项">
<menu>
<item
android:id="@+id/item3_child1"
android:title="1子选项"/>
<item
android:id="@+id/item3_child2"
android:title="2子选项"/>
</menu>
</item>
通过纯代码的方式添加item:
// 除了通过xml文件向menu对象中添加显示的item选项之外,也可通过纯代码的方式添加
/*
* 参数1: 组id, 通常用于判断多个item是否为同一组,少数通过setGroup**方法同时设置多个item达到效果
* 参数2:item的id,相当于设置item标签的id属性
* 3: 排列优先级
* 4:显示的文字
*/
menu.add(8, 3, 4, "纯代码");
//设置属于此组的item是否可用
// menu.setGroupEnabled(0, false);
SubMenu sub = menu.addSubMenu("纯代码子选项");
sub.add("chun1");
sub.add("chun2");
return true;
}
二、Context Menu:
特点及作用::
当长按某控件后在屏幕居中位置弹出的类似于列表对话框效果的菜单
使用方式:
- 创建xml文件,处理方式与Options Menu基本相同
- 在代码中添加重写方法:
//参数二:长按显示ContextMenu对应的那个控件
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
// TODO Auto-generated method stub
super.onCreateContextMenu(menu, v, menuInfo);
getMenuInflater().inflate(R.menu.main, menu);
}
3.在onCreate方法中通过registerForContextMenu方法注册长按哪个控件可以显示ContextMenu
//当长按参数中指定的控件对象时,显示ContextMenu
registerForContextMenu(tv);
ContextMenu与ListView的配合使用:
/*
* 当给ListView或者GridView,有多个item的控件设置ContextMenu时
* 是给ListView的中每个item设置显示的ContextMenu
* */
registerForContextMenu(lv);
设置点击事件时:
//当ContextMenu中的选项被选中时,触发的方法
@Override
public boolean onContextItemSelected(MenuItem item) {
// TODO Auto-generated method stub
switch (item.getItemId()) {
case R.id.item1:
Log.i("oye", "被点击的是选项一 !!!");
break;
case R.id.item2:
Log.i("oye", "被点击的是选项二#####!");
//获取listView中被选中的positon
//1. 根据item对象获取菜单信息
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
//信息对象中的position属性存储了长按item对应的位置
int pos=info.position;
list.remove(pos);
adapter.notifyDataSetChanged();
break;
case R.id.item3:
Log.i("oye", "被点击的是选项三****");
break;
}
return super.onContextItemSelected(item);
}
三、PopupMenu
特点及作用:
- 显示位置可以自定义(指定显示在控件的下方)
- 触发显示的方式可以自定义
如:可以设置单击某控件或者长按某控件时显示
使用方式:
1. 获取控件对象,并设置想要的监听
2. 处理xml文件,处理方式参考optionsmenu
3. 在监听事件的重写方法中:
// 显示PopupMenu
//1. 初始化popupMenu对象
//参数2:想要让pm稍后显示在哪个控件的下方
PopupMenu pm = new PopupMenu(MainActivity.this, tv);
//2. 向pm中添加要显示的item选项
// 添加方式一
pm.inflate(R.menu.main);
//添加方式二
// getMenuInflater().inflate(R.menu.main, pm.getMenu());
//3.设置显示
pm.show();
四、PopupWindow 弹出窗口
特点及作用:
- 效果来说,是最灵活的对话框效果
- 可以完全自定义位置
- 可以自定义显示内容
- 可以自定义显示的宽高
- 自定义触发方式
使用方式:
//显示PopupWindow
View contentView = LayoutInflater.from(MainActivity.this).inflate(R.layout.pw, null);
/*
* 初始化对象
* 1:View 对象,即由自定义显示内容对应的布局转化成的View对象
* 2,3: 设置pw显示后的宽高
*/
final PopupWindow pw = new PopupWindow(contentView, 500, LayoutParams.WRAP_CONTENT);
//设置获取焦点,只有获取焦点后pw中的内容才能接收点击事件
pw.setFocusable(true);
//设置点击返回键可将pw关闭
pw.setBackgroundDrawable(new ColorDrawable());
pw.setOutsideTouchable(true);
//调用方法显示
//显示方式一:效果类似于popupMenu,即直接显示在参数指定控件的下方
// pw.showAsDropDown(tv);
//显示方式二:
pw.showAtLocation(v, Gravity.TOP|Gravity.CENTER_HORIZONTAL, 0, 300);
//设置converview中button的点击
((Button)contentView.findViewById(R.id.button2)).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
pw.dismiss();
}
});