PopupWindow学习

来源:互联网 发布:php打印三角形 编辑:程序博客网 时间:2024/05/07 10:32

一.Android的对话框有两种:PopupWindow和AlertDialog

  • 两者的区别和联系

           本质区别为:AlertDialog是非阻塞式对话框:AlertDialog弹出时,后台还可以做事情;而PopupWindow是阻塞式对话框:PopupWindow弹出时,程序会等待,在PopupWindow退出前,程序一直等待,只有当我们调用了dismiss方法的后,PopupWindow退出,程序才会向下执行。这两种区别的表现是:AlertDialog弹出时,背景是黑色的,但是当我们点击背景,AlertDialog会消失,证明程序不仅响应AlertDialog的操作,还响应其他操作,其他程序没有被阻塞,这说明了AlertDialog是非阻塞式对话框;PopupWindow弹出时,背景没有什么变化,但是当我们点击背景的时候,程序没有响应,只允许我们操作PopupWindow,其他操作被阻塞。


二.PopupWindow的位置按照有无偏移分,可以分为偏移和无偏移两种;按照参照物的不同,可以分为相对于某个控件(Anchor锚)和相对于父控件。具体如下

  • showAsDropDown(View anchor):相对某个控件的位置(正左下方),无偏移
  • showAsDropDown(View anchor, int xoff, int yoff):相对某个控件的位置,有偏移

  • showAtLocation(View parent, int gravity, int x, int y):相对于父控件的位置(例如正中央Gravity.CENTER,下方Gravity.BOTTOM等),可以设置偏移或无偏移
  •  setContentView(popupconten);//重新设置PopupWindow的内容
  • pw.setFocusable(true);//默认是false,为false时,PopupWindow没有获得焦点能力,如果这是PopupWindow的内容中有EidtText,需要输入,这是是无法输入的;只有为true的时候,PopupWindow才具有获得焦点能力,EditText才是真正的EditText。
三.部分代码
 View popView = inflater.inflate(R.layout.listview_pop, null);        popupWindow = new PopupWindow(popView, LayoutParams.WRAP_CONTENT,   LayoutParams.WRAP_CONTENT);
  //这句是为了防止弹出菜单获取焦点之后,点击activity的其他组件没有响应
        popupWindow.setBackgroundDrawable(new ColorDrawable(0));        //设置popwindow出现和消失动画        popupWindow.setAnimationStyle(R.style.PopMenuAnimation);
 //设置popwindow显示位置        popupWindow.showAtLocation(parent, 0, x, y);        //获取popwindow焦点        popupWindow.setFocusable(true);        //设置popwindow如果点击外面区域,便关闭。
//注意这里必须设置setBackgroundDrawable属性否则不能关闭
popupWindow.setOutsideTouchable(true);
popupWindow.setOnDismissListener(){
publuc void onDismiss(){
//处理逻辑更改关闭状态
}
}
popupWindow.update();

0 0