PopupMenu和PopupWindow类似(但并不是继承关系), 可以显示固定在一个View下方, 且默认实现了弹出动画, 所以过渡也没有像PopupWindow那么僵硬. 可以说是为了实现弹出式菜单而封装的类.
该类在Android3.0(API11)开始添加, 对于3.0以前提供android.support.v7.widget.PopupMenu
向下兼容包.
PopupMenu的方法其实很少, 所以全部看一遍.
创建
创建并显示一个PopupMenu分为三个步骤
- 创建PopupMenu对象
- 填充一个Menu xml文件
- 显示
构造方法
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
一般填充方式
popupMenu.getMenuInflater().inflate(menuRes, popupMenu.getMenu()).复制代码
Android4.0(API14)后新增的简化方法:
void inflate (int menuRes) // 直接传入Menu文件id即可复制代码
显示和隐藏
void show () // 显示void dismiss () // 隐藏复制代码
监听器
PopupMenu关闭事件监听
void setOnDismissListener (PopupMenu.OnDismissListener listener)复制代码
菜单选项事件监听
void setOnMenuItemClickListener (PopupMenu.OnMenuItemClickListener listener)复制代码
滑动开打
这个方法蛮有意思的. 可以通过拖拽显示固定的View来打开PopupMenu.
View.OnTouchListener getDragToOpenListener ()复制代码
我觉得我需要演示下
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.LEFT
和Gravity.RIGHT
, 这类setGravity
的方法基本上都是Android6.0后添加的.
void setGravity (int gravity)int getGravity ()复制代码