一、AlertDialog与PopupWindow的区别 本质区别为:AlertDialog是非阻塞式对话框:AlertDialog弹出时,后台还可以做事情;而PopupWindow是阻塞式对话框:PopupWindow弹出时,程序会等待,在PopupWindow退出前,程序一直等待,只有当我们调用了dismiss方法的后,PopupWindow退出,程序才会向下执行。这两种区别的表现是:AlertDialog弹出时,背景是黑色的,但是当我们点击背景,AlertDialog会消失,证明程序不仅响应AlertDialog的操作,还响应其他操作,其他程序没有被阻塞,这说明了AlertDialog是非阻塞式对话框;PopupWindow弹出时,背景没有什么变化,但是当我们点击背景的时候,程序没有响应,只允许我们操作PopupWindow,其他操作被阻塞 二、创建PopupWindow的核心代码:
- <font size="2"> // 加载PopupWindow的布局文件
- View contentView = LayoutInflater.from(getApplicationContext())
- .inflate(R.layout.popup, null);
- // 设置PopupWindow的背景颜色
- contentView.setBackgroundColor(Color.RED);
- // 声明一个对话框
- final PopupWindow popupWindow = new PopupWindow(null, 200, 300);
- // 为自定义的对话框设置自定义布局
- popupWindow.setContentView(contentView);
-
- // 这个popupWindow.setFocusable(true);非常重要,如果不在弹出之前加上这条语句,你会很悲剧的发现,你是无法在
- // editText中输入任何东西的。该方法可以设定popupWindow获取焦点的能力。当设置为true时,系统会捕获到焦点给popupWindow
- // 上的组件。默认为false哦.该方法一定要在弹出对话框之前进行调用。
- popupWindow.setFocusable(false);
-
- //设置PopupWindow弹出的位置。
- // popupWindow.showAsDropDown(View view)弹出对话框,位置在紧挨着view组件
- // showAsDropDown(View anchor, int xoff, int yoff)弹出对话框,位置在紧挨着view组件,x y代表着偏移量
- // showAtLocation(View parent, int gravity, int x, int y)弹出对话框, parent 父布局 gravity 依靠父布局的位置如Gravity.CENTER x y 坐标值
- popupWindow.showAsDropDown(button);</font>
复制代码
三、PopupWindow在点击外部区域的时候消失 我用的是Android4.0的系统:
- <font style="font-size: 18px" size="2">PopupWindow.setBackgroundDrawable(getResources().getDrawable(R.drawable.ic_launcher));
- PopupWindow.setFocusable(true);</font>
复制代码
说明:这两个之间是没有顺序的,且setFocusable这个方法必须设置为true。 这样设置以后,当点击PopupWindow外部时,PopupWindow就会消失。 四、效果是PopupWindow弹出的位置在整个Activity的中央位置
-
- // 创建界面,显示数据
- View view = View.inflate(context, R.layout.fileinfo, null);
- // 2.1给view添加监听器
- initPopupWindowView(view, position);
- // 3、
- popup = new PopupWindow(view, 400, LayoutParams.WRAP_CONTENT,
- true);
- popup.setBackgroundDrawable(getResources().getDrawable(
- R.drawable.popup_rectangle));
- View decorView = BooksAndTableAvtivity.this.getWindow()
- .getDecorView();
- popup.showAtLocation(decorView, Gravity.CENTER, 0, 0);
复制代码
- 这里面需要注意的是:
- 1、LayoutParams是WindowManager中的内部类,
2、decorView是Activity中Window中的view tree的根节点 五、设置动画 一、怎么设置动画 1、在value文件夹下的styles中设置上style
-
- <resources>
- <style name="PopupAnimation1111111111111">
- <item name="android:windowEnterAnimation">@anim/scale_anim</item>
- <item name="android:windowExitAnimation">@anim/rotate_anim</item>
- </style>
-
- </resources>
复制代码
2、在调用PopupWindow的setAnimationStyle(R.style.XXX); 二、对PopupWindow的update方法的理解: 当在PopupWindow显示过程(调用了showAsDropDown)中改变了PopupWindow的设置,如果没有调用update 方法,那么这个设置只能在下次显示的时候才会有效果 转载:http://www.apkbus.com/forum.php?mod=viewthread&tid=148813 |