PopupWindow(弹出窗体)在app应用中十分常见,介绍一下基础用法。
代码如下:
<span style="white-space:pre"> </span>private View mView;
private PopupWindow mPopupWindow;
private void showPopup(View v) {
mView = getLayoutInflater().inflate(R.layout.popupwindow, null);
mPopupWindow = new PopupWindow(mView, LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT);
mPopupWindow.showAsDropDown(v);
}
需要事先在res的layout文件夹下新建一个popupwindow的布局文件,然后在activity的某一个触发事件(比如按钮点击)中调用showPopup()方法即可。
一般会设置一些常用的属性:
1、弹出窗的大小
popupWindow构造函数的签名:
<span style="white-space:pre"> </span>public PopupWindow(View contentView, int width, int height) {
<span style="white-space:pre"> </span>this(contentView, width, height, false);
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>public PopupWindow(View contentView, int width, int height, boolean focusable) {
<span style="white-space:pre"> </span>if (contentView != null) {
<span style="white-space:pre"> </span>mContext = contentView.getContext();
<span style="white-space:pre"> </span>mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>setContentView(contentView);
<span style="white-space:pre"> </span>setWidth(width);
<span style="white-space:pre"> </span>setHeight(height);
<span style="white-space:pre"> </span>setFocusable(focusable);
<span style="white-space:pre"> </span>}
很简单直接new一个,大小随便设置。
2、弹出窗显示的位置
2.1 一般直接调用showAsDropDown(View view)
看看方法签名:
<span style="white-space:pre"> </span>/**
* <p>Display the content view in a popup window anchored to the bottom-left
* corner of the anchor view. If there is not enough room on screen to show
* the popup in its entirety, this method tries to find a parent scroll
* view to scroll. If no parent scroll view can be scrolled, the bottom-left
* corner of the popup is pinned at the top left corner of the anchor view.</p>
*
* @param anchor the view on which to pin the popup window
*
* @see #dismiss()
*/
public void showAsDropDown(View anchor) {
showAsDropDown(anchor, 0, 0);
}
大意是参照view控件的左下角为基准,如果没有足够的空间显示这个popup,那么会参照view控件的左上角为基准。
当然看到这个方法的实现 showAsDropDown(anchor, 0, 0); 你还可以设置相对于左下角的偏移量。
2.2 也可以用showAtLocation()方法设置它相对于它的父布局的位置 。
看看方法签名:
<span style="white-space:pre"> </span>public void showAtLocation(View parent, int gravity, int x, int y) {
<span style="white-space:pre"> </span>showAtLocation(parent.getWindowToken(), gravity, x, y);
<span style="white-space:pre"> </span>}
其中的gravity参数,可以设置成布局的一些常量比方:Gravity.LEFT | Gravity.TOP,x 、y 就是相对于左上的偏移量。
2个方法大致都是选取一个控件作为一个基准点,然后设置它的偏移量来确定显示位置。
3、弹出窗上的其它按钮交互
比较常用的是在弹出窗体上设置一个close按钮,然后监听onClickListener事件。
还有一种常用的情况是 popupwindow显示一个列表,然后点击列表的一个item,弹出另外一个popupwindow显示item详情。这种情况下点击列表的item时需要处理一些数
据的传递以及界面效果的更改显示。
4、弹出窗显示之后点击周围区域自动消失。
这种网上有2种常见的解决方法。
4.1 设置周围可点击,并设置背景
<span style="white-space:pre"> </span>mPopupWindow.setOutsideTouchable(true);
mPopupWindow.setBackgroundDrawable(new BitmapDrawable());
需要注意的是,这种写法setBackgroundDrawable(null)是错误的。以及上面2句需要设置在
showAsDropDown()方法之前。
4.2重写popup的父控件的onTouch事件,并且设置焦点在popup上
<span style="white-space:pre"> mPopupWindow.setFocusable(true);<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>mView.setOnTouchListener(new OnTouchListener() {
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>@Override
<span style="white-space:pre"> </span>public boolean onTouch(View v, MotionEvent event) {
<span style="white-space:pre"> </span>if(mPopupWindow.isShowing()){
<span style="white-space:pre"> </span>mPopupWindow.dismiss();
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>return true;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}); </span>
如果popupwidow.dismiss()之后,还有一些其它的操作,比如关闭网络连接、设置参数等可以用onDismissListener()方法。
<span style="white-space:pre"> </span>mPopupWindow.setOnDismissListener(new OnDismissListener() {
@Override
public void onDismiss() {
mPopupWindow = null;
}
});