今天结合自己在项目开发中的使用,对PopupWindow做一下总结,并对PopupWindow与Dialog做一下对比分析。
PopupWindow使用
private void showPopwindow() {
// 获取自定义布局文件activity_popupwindow_left.xml的视图
View popupWindow_view = getLayoutInflater().inflate(R.layout.layout_subject, null, false);
// 创建PopupWindow实例,200,LayoutParams.MATCH_PARENT分别是宽度和高度
popupWindow = new PopupWindow(popupWindow_view, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT, true);
ColorDrawable dw = new ColorDrawable(0xb0000000);
popupWindow.setBackgroundDrawable(dw);
popupWindow.setFocusable(true);
popupWindow.setOutsideTouchable(false);
popupWindow.setAnimationStyle(R.style.PopupAnimation);
// 设置动画效果
RecyclerView recylerView = (RecyclerView) popupWindow_view.findViewById(R.id.recylerView);
recylerView.setHasFixedSize(true);
recylerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false));
recylerView.setAdapter(new SubjectAdapter());
// 点击其他地方消失
popupWindow_view.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
if (popupWindow != null && popupWindow.isShowing()) {
popupWindow.dismiss();
popupWindow = null;
}
return false;
}
});
}
getLayoutInflater()引入自定义布局;
PopupWindow构造方法来设置宽高;
setBackgroundDrawable()设置背景;
setFocusable(true)获取焦点;
setOutsideTouchable(true)触摸屏幕其他位置消失;
setAnimationStyle(int)设置动画
PopupWindow背景透明度
/**
* 设置添加屏幕的背景透明度
*
* @param bgAlpha
*/
public void backgroundAlpha(float bgAlpha) {
WindowManager.LayoutParams lp = getWindow().getAttributes();
lp.alpha = bgAlpha; //0.0-1.0
getWindow().setAttributes(lp);
}
PopupWindow显示位置
showAsDropDown(View anchor):相对某个控件的位置(正左下方),无偏移。
showAsDropDown(View anchor, int xoff, int yoff):相对某个控件的位置,有偏移。
showAtLocation(View parent, int gravity, int x, int y):相对于父控件的位置(例如正中央Gravity.CENTER,下方Gravity.BOTTOM等),可以设置偏移或无偏移。
PopupWindow与Dialog的区别
1.PopupWindow是阻塞线程的,AlertDialog是非阻塞线程的。就是说AlertDialog在显示时线程还在运行,PopupWindow显示时线程陷入等待,直到dismiss才会继续。
2.Dialog没法设置宽为整个屏幕宽,总有点边界。Popupwindow可以(PopupWindow也可以设置有边界)。
不管是dialog还是popwindow,在调用ondestroy()时都要dismiss,否则会报错。
自定义AlertDialog小结
Dialog myDialog = new AlertDialog.Builder(MainActivity.this).create();
myDialog.show();
Window window = myDialog .getWindow();
window.setWindowAnimations(R.style.dialog_anim);
myDialog.getWindow().setContentView(R.layout.mydialog);
myDialog.getWindow()
.findViewById(R.id.button_back_mydialog)
.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
myDialog.dismiss();
}
});
setContentView()加载自定义布局;
setWindowAnimations()设置动画;
设置大小可以通过布局来设置,也可以动态设置
//设置大小
WindowManager.LayoutParams layoutParams = dialog.getWindow().getAttributes();
layoutParams.width = 200;
layoutParams.height = LayoutParams.WRAP_CONTENT;
显示位置
方式一:
window.setGravity(Gravity.TOP);
方式二:
AlertDialog dlg = new AlertDialog.Builder(this).create();
//-------------------------------------------------------------------
Window w=dlg.getWindow();
WindowManager.LayoutParams lp =w.getAttributes();
lp.x=10;
lp.y=150;
dialog中包含Edittext,会导致点击无法弹出软键盘
myDialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
myDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE |
WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
恩,总结到此!