PopupMenu

2,355 阅读2分钟

我平时项目开发必备框架

  1. Android上最强网络请求 Net
  2. Android上最强列表(包含StateLayout) BRV
  3. Android最强缺省页 StateLayout
  4. JSON和长文本日志打印工具 LogCat
  5. 支持异步和全局自定义的吐司工具 Tooltip
  6. 开发调试窗口工具 DebugKit
  7. 一行代码创建透明状态栏 StatusBar

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

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

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

创建

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

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

构造方法

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.LEFTGravity.RIGHT, 这类setGravity的方法基本上都是Android6.0后添加的.

void setGravity (int gravity)
int getGravity ()