AlertDialog是非阻塞式对话框:AlertDialog弹出时,后台还可以做事情;而PopupWindow是阻塞式对话框:PopupWindow弹出时,程序会等待,在PopupWindow退出前,程序一直等待,只有当我们调用了dismiss方法的后,PopupWindow退出,程序才会向下执行。这两种区别的表现是:AlertDialog弹出时,背景是黑色的,但是当我们点击背景,AlertDialog会消失,证明程序不仅响应AlertDialog的操作,还响应其他操作,其他程序没有被阻塞,这说明了AlertDialog是非阻塞式对话框;PopupWindow弹出时,背景没有什么变化,但是当我们点击背景的时候,程序没有响应,只允许我们操作PopupWindow,其他操作被阻塞。
前面学习过在子线程中不能随便更新主线程UI,我们需要通过Handler在子线程更新主线程UI。
今天在项目中碰到一个问题,在主线程中更新UI,ProgressDialog在webservicef方法执行之后才显示出来,查了网上一些资料,知道原来是执行webservice接口方法阻塞了UI线程,所以progressdialog就等到webservice执行完毕之后才显示了。
如果只在webservice执行完之后想更新UI,这样做是没可以的,但是想在其之前更新UI,给用户一个好的体验就不行了。
想要做到这一点,就必须另起一个子线程,在子线线程更新主线程UI,再执行webservice方法,这时执行webservice方法就不会阻塞主线程UI了。
View popuView = getLayoutInflater().inflate(R.layout.select_area, null); setUpViews(popuView); setUpListener(); setUpData(); final PopupWindow mPopupWindow = new PopupWindow(popuView, LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT, true); mPopupWindow.setFocusable(true); mPopupWindow.setOutsideTouchable(true); mPopupWindow.update(); mPopupWindow.setAnimationStyle(R.style.mypopwindow_anim_style); // mPopupWindow.setBackgroundDrawable(new BitmapDrawable()); // ColorDrawable dw = new ColorDrawable(0xe6e6e6); // BitmapDrawable dw = new BitmapDrawable(getResources(), BitmapFactory.decodeResource(getResources(),R.drawable.xbt)); // mPopupWindow.setBackgroundDrawable(getResources().getDrawable(R.drawable.xbt)); //加上background,触摸popupwindow外部,popupwindow才消失 mPopupWindow.showAtLocation(this.getWindow().getDecorView(), Gravity.BOTTOM,0,0);注意:如果你想让自己的popupwindow在Activity启动的时候就显示的话,不能放在onCreate方法中,因为这个时候,界面组件还未加载好,所以会提示你你的Activity是否已经启动了,你可以放在onAttachedToWindow方法中。
关于显示的位置方法showAtLocation(parent, gravity, x, y),这里的参数parent指的是这个popupwindow相对的是哪个父类,比如你想要让这个popupwindow相对于整个屏幕那么你的parent可以是:
View parent = this.getWindow().getDecorView();
parent.getHeight()得到的值是你的屏幕的高度(像素)。这个时候,x,y就是它在这个parent中的相对位置了。Gravity默认是左上Left,Top
例如:下面的代码设置了popupwindow在屏幕的左下角的位置。
View parent = this.getWindow().getDecorView();//高度为手机实际的像素高度 pwMyPopWindow.showAtLocation(parent, Gravity.NO_GRAVITY, (int)(parent.getWidth()/18), parent.getHeight() - btnAddTask.getHeight() - (int)(parent.getHeight()/9));