一。 二者的区别:
AlertDialog和PopupWindow区别是后者是线程阻塞的。前者的位置固定,而后者的位置灵活随意。
二。主要方法注解:
1 showAsDropDown(View anchor):相对某个控件的位置(正左下方),无偏移
2 showAsDropDown(View anchor, int xoff, int yoff):相对某个控件的位置,有偏移
3 showAtLocation(View parent, int gravity, int x, int y):相对于父控件的位置(例如正中央Gravity.CENTER,下方Gravity.BOTTOM等),可以设置偏移或无偏移
三。使用
初始化控件
private void initPopupWindow(View view){
//view窗体的显示控件
mPopupWindow=new PopupWindow(view, LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT);
//mPopupWindow.setBackgroundDrawable(new BitmapDrawable());//必须设置background才能消失
//mPopupWindow.setBackgroundDrawable(getResources().getDrawable(R.drawable.rounded_corners));
//mPopupWindow.setOutsideTouchable(false);
动画效果
//自定义动画
//mPopupWindow.setAnimationStyle(R.style.PopupAnimation);
//使用系统动画 //mPopupWindow.setAnimationStyle(android.R.style.Animation_Translucent);
mPopupWindow.update();
获得焦点及可touch
mPopupWindow.setTouchable(true);
mPopupWindow.setFocusable(true);
}
显示PopUpWindow
private void showPopupWindow(View anchor) {
if(!mPopupWindow.isShowing()){
mPopupWindow.showAsDropDown(anchor,-25,10);
//mPopupWindow.showAtLocation(view, Gravity.BOTTOM, 0, 0);
}
}
popupWindow全屏,区别是否点击了特定view
popView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
if(v.getId()==R.id.action_click){
Toast.makeText(MainActivity.this, "pop的button", 1000).show();
}else{
dismissI();
}
return false;
}
});
点击外围区域包括back键,popUpWindow不消失
第一次实现的时候遇到了问题,就是弹出框不会在按下Back键的时候消失,点击弹框外区域也没有正常消失,搜索了一下,都说只要设置背景就好了。
然后我就找了个图片,果然弹框能正常dismiss了