Android弹出式菜单_PopupMenu详解

PopupMenu和PopupWindow类似(但并不是继承关系), 可以显示固定在一个View下方, 且默认实现了弹出动画, 所以过渡也没有像PopupWindow那么僵硬. 可以说是为了实现弹出式菜单而封装的类.

该类在Android3.0(API11)开始添加, 对于3.0以前提供android.support.v7.widget.PopupMenu向下兼容包.

PopupMenu的方法其实很少, 所以全部看一遍.

创建

创建并显示一个PopupMenu分为三个步骤

  1. 创建PopupMenu对象
  2. 填充一个Menu xml文件
  3. 显示

构造方法

1
2
3
4
5
6
7
8
9
10
11
12
PopupMenu (Context context, //上下文
View anchor) // 显示固定的View对象
PopupMenu (Context context,
View anchor,
int gravity) // 显示在View的左下方还是右下方. 默认左下方
PopupMenu (Context context,
View anchor,
int gravity,
int popupStyleAttr,
int popupStyleRes)

填充Menu

一般填充方式

1
popupMenu.getMenuInflater().inflate(menuRes, popupMenu.getMenu()).

Android4.0(API14)后新增的简化方法:

1
void inflate (int menuRes) // 直接传入Menu文件id即可

显示和隐藏

1
2
void show () // 显示
void dismiss () // 隐藏

监听器

PopupMenu关闭事件监听

1
void setOnDismissListener (PopupMenu.OnDismissListener listener)

菜单选项事件监听

1
void setOnMenuItemClickListener (PopupMenu.OnMenuItemClickListener listener)

滑动开打

这个方法蛮有意思的. 可以通过拖拽显示固定的View来打开PopupMenu.

1
View.OnTouchListener getDragToOpenListener ()

我觉得我需要演示下

1
2
3
4
5
6
public void onClick() {
PopupMenu popupMenu = new PopupMenu(this, mToolbar);
popupMenu.getMenuInflater().inflate(R.menu.popup_menu, popupMenu.getMenu());
mToolbar.setOnTouchListener(popupMenu.getDragToOpenListener());
popupMenu.show();
}

奇怪的是还得先点击打开PopupMenu后才能使用这个滑动选择

其他方法

设置PopupMenu显示位置

该方法PopupWindow同样有, 支持Gravity.LEFTGravity.RIGHT, 这类setGravity的方法基本上都是Android6.0后添加的.

1
2
void setGravity (int gravity)
int getGravity ()