PopupWindow详解

popupWindow 与 AlertDialog 区别

AlertDialog 创建时不能指定显示位置,默认显示在屏幕中间(通过设置WindowManager参数可以改变位置)。
PopupView 可以指定显示位置。

popupView构造函数详解

1
2
3
4
5
6
7
8
9
10
11
构造一:
public PopupWindow(Context context);
构造二:
public PopupWindow(View contentview);
构造三:
public PopupWindow(View contentView, int width, int height);
构造四:
public PopupWindow(View contentView, int width, int height, boolean focusable);

生成 popupWindow 最基本的三个条件是: contentView, width, height;
所以使用构造一、构造二来构造, 那么完整的代码应该是这样的:

1
2
3
4
5
View contentView = LayoutInflater.from(context.inflate(resId,null));
PopupWindow pop = new PopupWindow(context);
pop.setContentView(contentView);
pop.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT);
pop.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);

为什么 popupWindow 一定要设置 contentView?

因为 PopupWindow 没有默认布局,它的布局需要通过我们自己设置才行。

为什么 popupWindow 一定要设置 width、height? contentView 布局不是包含了这些信息么?

// todo 写一篇关于 inflate 的文章。

popupView 常用函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
// **显示函数**
// 挂载在 anchor 的左正下方,没有偏移量
showAsDropDown(View anchor);
// 挂载在 anchor 的下方,但是有偏移量; xoff / yoff 为正表示在x/y轴正向偏移。
showAsDropDown(View anchor, int xoff, int yoff);
// 相对于父控件的位置
showAtLocation(View parent, int gravity, int x, int y);
// **其他常用函数**
public void dismiss();
public void setTouchable(boolean touchable);
public void setFocusable(boolean focusable);
public void setOutsideTouchable(boolean touchable);
public void setBackgroundDrawable(Drawable background);
  1. setTouchable(boolean touchable)
    设置 PopupView 是否响应 Touch 事件,默认是 true , 如果设置为 false, 所有的 touch 事件都没有响应, 包括点击事件。

  2. setFocusable(boolean focusable)
    设置 PopupView 是否具有获取焦点的能力,默认是 false。 一般来说,普通控件不需要获取焦点,但是 EditText 例外, 如果不能获取焦点,不能输入。

  3. setOutsideTouchable(boolean touchable)
    设置 PopupView 以外的区域是否可点击, 也就是指 如果点击 PoppupView 以外的区域是否会消失。

    特别注意,在setOutsideTouchable(boolean touchable) 之前要调用设置背景:

    1
    2
    mPopWindow.setBackgroundDrawable(new BitmapDrawable());
    mPopWindow.setOutsideTouchable(true);
  4. setBackgroundDrawable(Drawable background)

参考资料:

PopUpWindow使用详解(二)——进阶及答疑