AlertDialog简单使用:
LayoutInflater inflater = LayoutInflater.from(this);
View layout=inflater.inflate(R.layout.activity_main,null);
AlertDialog.Builder dialog = new AlertDialog.Builder
(MainActivity.this);
dialog.setView(layout);
// dialog.setTitle("标题");
// dialog.setMessage("类容");
// dialog.setCancelable(false); //false返回键可dismiss true不响应返回键
// dialog.setPositiveButton("确定",
// new DialogInterface.OnClickListener() {
// @Override
// public void onClick(DialogInterface dialog, int which) {
// }
// });
dialog.show();
AlertDialog builder用来提示用户一些信息,用起来也比较简单,
设置标题类容 和按钮即可,
如果是加载的自定义的view ,调用 dialog.setView(layout);加载布局即可(其他的设置标题 类容 这些就不需要了)
PopupWindow简单使用:
PopupWindow popupWindow;
View contentView;
public void showpw(){
contentView = LayoutInflater.from(MainActivity.this).inflate(
R.layout.pw_item, null);
popupWindow = new PopupWindow(contentView,
RadioGroup.LayoutParams.WRAP_CONTENT, RadioGroup.LayoutParams.WRAP_CONTENT, true);
// 如果不设置PopupWindow的背景,无论是点击外部区域还是Back键都无法dismiss弹框
// 我觉得这里是API的一个bug
popupWindow.setBackgroundDrawable(new BitmapDrawable());
//背景半透明(不需要不调用即可)
initPw();
popupWindow.showAtLocation(tv, Gravity.CENTER, 0, 0); //相对整个布局居中
// popupWindow.showAsDropDown(tv); //在某个控件下面
}
//初始化pw半透明效果
public void initPw() {
//设置半透明
WindowManager.LayoutParams lp=getWindow().getAttributes();
lp.alpha = 0.4f;
getWindow().setAttributes(lp);
popupWindow.setOutsideTouchable(true);
popupWindow.setFocusable(true);
popupWindow.update();
popupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
//在dismiss中恢复透明度
public void onDismiss() {
WindowManager.LayoutParams lp = getWindow().getAttributes();
lp.alpha = 1f;
getWindow().setAttributes(lp);
}
});
}
区别:
Android中的对话框有两种:PopupWindow和AlertDialog。它们都可以实现弹窗功能,但是他们之间有一些差别,下面总结最重要的一点。(其他区别不重要)
AlertDialog是非阻塞式对话框:AlertDialog弹出时,后台还可以做事情;而PopupWindow是阻塞式对话框:PopupWindow弹出时,程序会等待,在PopupWindow退出前,程序一直等待,只有当我们调用了dismiss方法的后,PopupWindow退出,程序才会向下执行。
bug:
另外记录下今天遇见的一个bug,为了测试效果 直接在activity的oncreate中直接调用的popupwindow的show方法
然后报了个错
Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not
去翻译了一下, 大概的意思就是pw的活动体不存在什么的, 问题肯定出在pw的show里面的view了
然后去谷歌查了下 也就是说oncreate的时候这个view实际上是还没有彻底加载完毕的 所以报错了 改成点击后showpw 错误搞定