区别如下:
1. AlertDialog是非阻塞线程的,AlertDialog弹出的时候,后台可是还可以做其他事情
PopupWindow是阻塞线程的,PopupWindow弹出时,程序会等待,在PopupWindow退出前,程序一直等待,
只有当我们调用了dismiss方法的后,PopupWindow退出,程序才会向下执行。
2.AlertDialog的位置固定
setIcon :为对话框设置图标
setMessage:为对话框设置内容
setView : 给对话框设置自定义样式
setItems :设置对话框要显示的一个list,一般用于显示几个命令时
setMultiChoiceItems :用来设置对话框显示一系列的复选框
setNeutralButton :普通按钮
setNegativeButton :对话框添加"No"按钮
create : 创建对话框
show :显示对话框
setTitle("对话框的标题").
setMessage("对话框的内容").
示例:
new AlertDialog.Builder(MainActivity.this)
.setTitle("简易对话框")
.setMessage("对话框文本")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
/*
* 第一个参数:上下文对象。可用getApplicationContext()或当前Activity.
this
* 第二个参数:要显示的字符串
* 第三个参数:显示时间的长短。Toast有默认的两个LENGTH_SHORT(短)和LENGTH_LONG(长),也可以使用毫秒2000ms
* */
Toast.makeText(MainActivity.this,"按了确定按钮",Toast.LENGTH_SHORT).show();
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this,"按了取消按钮",Toast.LENGTH_SHORT).show();
}
})
.show();
PopupWindow的位置按照有无偏移分,可以分为偏移和无偏移两种;按照参照物的不同,可以分为相对于某个控件
(Anchor锚)和相对于父控件。具体如下
showAsDropDown(View anchor):相对某个控件的位置(正左下方),无偏移
showAsDropDown(View anchor, int xoff, int yoff):相对某个控件的位置,有偏移
showAtLocation(View parent, int gravity, int x, int y):相对于父控件的位置(例如正中央Gravity.CENTER,
下方Gravity.BOTTOM等),可以设置偏移或无偏移
LayoutInflater layoutInflater = LayoutInflater.from(this);
View popupWindow = layoutInflater.inflate(R.layout.popup, null);
PopupWindow示例:
Android PopupWindow详解