您的位置:首页 > 运维架构

PopupWindow简单使用

2015-07-29 13:24 225 查看
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;
}
});
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: