Android的对话框有两种:popupWindow和AlertDialog。他们的不同点在于,AlertDialog的位置固定,而PopupWindow的位置可以随意
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呢
PopupWindow mPopupWindow = new PopupWindow(popupwindow,ViewGroup.LayoutParams.FILL_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT);
说了这么多,还是上代码吧:
public void popupWindowClick(View v){
//首先我们获取弹窗的布局,并给布局中的子布局添加事件,这里我们是弹窗中添加了两个按钮,因为是自定义的布局所以大家可以根据自己需求,来自己定义
View view = getLayoutInflater().i
nflate(R.layout.popupwindow,null);
Button button_update = (Button) view.
findViewById(R.id.button_update);
button_update.setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity2.this,
"update", Toast.LENGTH_SHORT).show();
}
});
Button button_delete = (Button) view.
findViewById(R.id.button2_delete);
button_delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity2.this,
"delete", Toast.LENGTH_SHORT).show();
}
});
//创建PopupWindow
PopupWindow popupWindow = new PopupWindow(view,
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
//设置相对于某个组件位置,此处为显示在btn组件下方
popupWindow.showAsDropDown(btn);
//设背景图()
popupWindow.setBackgroundDrawable(
new BitmapDrawable(getResources(),
BitmapFactory.decodeResource(
getResources(),R.drawable.ic_launcher)));
popupWindow.getBackground().setAlpha(100);//透明度
popupWindow.setAnimationStyle(a
ndroid.R.anim.fade_in);//动画效果
popupWindow.setOutsideTouchable(true);
popupWindow.setFocusable(true);
popupWindow.setTouchable(true);
//防止虚拟键盘被菜单遮挡
popupWindow.setSoftInputMode(
WindowManager.LayoutParams.
SOFT_INPUT_ADJUST_RESIZE);
// popupWindow.showAsDropDown(v);
//设置相对与父组件的位置
popupWindow.showAtLocation(v, Gravity.BOTTOM,0,0);
}
它们的不同点在于:AlertDialog的位置固定,而PopupWindow的位置可以随意
AlertDialog是非阻塞线程的,AlertDialog弹出的时候,后台可是还可以做其他事情的哦。而PopupWindow是阻塞线程的, 这就意味着在我们退出这个弹出框之前,程序会一直等待
525408217