PopUpWindow使用详解

2015/11/10 posted in  Android

前言

学习PopUpWindow,学习弹出窗口的使用,并且了解以及自定义PopUpWindow,以开发更好的应用。

1.PopupWindow与AlertDialog的区别

最关键的区别是AlertDialog不能指定显示位置,只能默认显示在屏幕最中间(当然也可以通过设置WindowManager参数来改变位置)。而PopupWindow是可以指定显示位置的,随便哪个位置都可以,更加灵活。

2.PopupWindow的相关函数

(1)构造函数

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的最基本的三个条件一定要设置View contentView,int width,int height,缺一不可。如果使用方法一构造依旧需要用setContentView(),setWidth(),setHeight()来对其进行设置。

(2)显示函数

showAsDropDown(View anchor)://相对某个控件的位置(正左下方),无偏移
showAsDropDown(View anchor, int xoff, int yoff)://相对某个控件的位置,有偏移;xoff表示x轴的偏移,正值表示向左,负值表示向右;yoff表示相对y轴的偏移,正值是向下,负值是向上
showAtLocation(View parent, int gravity, int x, int y)://相对于父控件的位置(例如正中央Gravity.CENTER,下方Gravity.BOTTOM等),可以设置偏移或无偏移

(3)其他函数

public void dismiss()
public void setFocusable(boolean focusable)
public void setTouchable(boolean touchable)
public void setOutsideTouchable(boolean touchable)
public void setBackgroundDrawable(Drawable background)

(4)PopupWindow设置动画

mPopWindow.setAnimationStyle(R.style.contextMenuAnim);//设置动画所对应的style

3.解决问题

(1)如何在弹出窗口时,使界面变暗。

在PopupWindow的界面外包裹一层RelativeLayout,将RelativeLayout的界面铺满整个界面,使其颜色为半透明背景,将PopupWindow的视图设置其位置即可。

(2)如何点击空白处的时候让PopupWindow消失

设置setBackgroundDrawable(new ColorDrawable(0x00000000));背景不为空但是完全透明。如此设置还能让PopupWindow在点击back的时候消失。

4.注意问题

(1)注意最终显示效果为代码中设置的PopupWindow的宽高,而不是xml中视图的宽高。

5.示例

public class MainActivity extends Activity {

    private PopupWindow mPopupWindow;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        View popupView = getLayoutInflater().inflate(R.layout.layout_popupwindow, null);

        mPopupWindow = new PopupWindow(popupView, LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, true);
        mPopupWindow.setTouchable(true);
        mPopupWindow.setOutsideTouchable(true);
        mPopupWindow.setBackgroundDrawable(new BitmapDrawable(getResources(), (Bitmap) null));

        mPopupWindow.getContentView().setFocusableInTouchMode(true);
        mPopupWindow.getContentView().setFocusable(true);
        mPopupWindow.getContentView().setOnKeyListener(new OnKeyListener() {
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                if (keyCode == KeyEvent.KEYCODE_MENU && event.getRepeatCount() == 0
                        && event.getAction() == KeyEvent.ACTION_DOWN) {
                    if (mPopupWindow != null && mPopupWindow.isShowing()) {
                        mPopupWindow.dismiss();
                    }
                    return true;
                }
                return false;
            }
        });
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_MENU && event.getRepeatCount() == 0) {
            if (mPopupWindow != null && !mPopupWindow.isShowing()) {
                mPopupWindow.showAtLocation(findViewById(R.id.layout_main), Gravity.BOTTOM, 0, 0);
            }
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }
}