PopupMenu是种显示位置不固定的弹出菜单,因为它显示在参照控件下方,所以展示位置随着参照控件的位置变化而变化,而且,坑人的是PopupMenu有两个版本,一个是在v7包中的,一个是在系统自带包中的,我下面讲的是v7包中的,其实两个都是差不多的,导包的时候主要下就可以,下面是创建PopupMenu时会用到的一些方法:
1、创建PopupMenu对象时的构造方法:PopupMenu pop = new PopupMenu(Context context, View anchor);
构造方法中有两个参数,第一参数是上下文对象,参数二是你点击了啥才显示PopupMenu的那个监听的View,比如我点击了Button bt就显示,那我就会给bt进行一个监听,bt.SetOnClickListener(this);然后就会有下面这个方法:
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_back://点击返回键
// 执行返回
break;
case R.id.del_all://点击了加号按钮
PopupMenu pop = new PopupMenu(this, v);//v是加号控件
pop.getMenuInflater().inflate(R.menu.history_list_pop_menu, pop.getMenu());
pop.show();
pop.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()){
case R.id.action_all_delete://点击了删除所有数据
//....
case R.id.action_hello://点击了...
.
.
上文中的v就是参数二,其实就是bt
2、对上面这段代码几个方法解释下,inflate这个方法可以加载一个PopupMenu的布局文件,要是你不想用pop.getMenuInflater().inflate(R.menu.history_list_pop_menu, pop.getMenu());
也可以这样写pop.inflate(R.menu.history_list_pop_menu);
也是可以的,我这里的布局文件是history_list_pop_menu,然后show就可以显示了,setOnMenuItemClickListener是对菜单中的选项进行监听的
下面我给出我的布局文件history_list_pop_menu代码段:就两个按钮
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<item
android:id="@+id/action_all_delete"
android:orderInCategory="100"
android:title="@string/all_delete"
app:showAsAction="never"
/>
<item
android:id="@+id/action_all_share"
android:orderInCategory="100"
android:title="@string/all_share"
app:showAsAction="never"
/>
</menu>
其实到这里,一个普通的PopupMenu已经完成了,但是,还有其他的几个方法也介绍下,可能用的上:
onOpenSubMenu : 显示子菜单。
onCloseSubMenu : 关闭子菜单。
onMenuItemSelected : 选择菜单项。
getMenu : 获得Menu对象。之后便能给Menu对象调用addSubMenu方法添加子菜单;addSubMenu返回一个SubMenu对象,可调用SubMenu的add方法给子菜单添加具体项目。
网上说有这个几个方法,反正我是没有找到,显示子菜单应该是在PopupMenu中再显示一个菜单吧,我怎么什么鬼也没有发现在哪?点击这里查看,这个博客里有提到,反正我找不到这些方法,希望大神们可以找到,或许是我v7包比较老吧!
我这里是可以直接使用的,并不需要什么onOpenSubMenu
看我的代码:
private SubMenu subMenu;
.
.
.
subMenu=popupMenu.getMenu().addSubMenu(0,999,9,"更多");//添加子菜单
subMenu.add(0, 111, 0, "子菜单1");
subMenu.add(0, 112, 1, "子菜单2");
我这里直接跳出更多,而且可以直接点击的,点击了更多后,会将子菜单1和子菜单2显示出来。
同样subMenu也是可以监听的。