语文教学网 加入收藏  -  设为首页
您的位置:语文教学网 > 知识 > 正文
Dialog 和 PopupWindow
Dialog 和 PopupWindow
提示:

Dialog 和 PopupWindow

参考 Dialog 和 Popupwindow 更多见于: Dialog 和 PopUpWindow的抉择 还是比较好奇 Dialog 和 PopupWindow 的区别的,一开始只觉得 Dialog 可能比较容易实现,适合一些简单的对话框,而 PopupWindow 则可以做一下比较复杂的布局。 最后看了别的博客之后发现两者的区别还是有的,在此做做笔记。 也就是说 AlertDialog 弹出时,后台还可以进行其他的操作, 而 Popupwindow 弹出的时候 后台进程会被阻塞 的,直到 Popupwindow 消失才会继续 还有设置 item 的点击事件的方法、设置宽高的方法都不尽相同, 具体也不详细的解释,看文档就差不多了 至于上面那个博客中提到的 AlertDialog 不可以设置宽为整个屏幕宽这一点, 其实还是可以的,原因是 AlertDialog 不能全屏是其默认的主题导致, 修改它的 style就可以实现,详情见我的另一篇 Dialog 笔记 关于 PopupWindow 也可以看看我写的 PopupWindow 笔记 总结起来,影响选择的因素最大的就是: 进程是否会被阻塞 、 弹出框的位置是否要求比较的特别 (意会) 其他的效果基本都能满足

Android中Popupwindow和Dialog的区别
提示:

Android中Popupwindow和Dialog的区别

Android中的对话框有两种:PopupWindow和AlertDialog。它们都可以实现弹窗功能,但是他们之间有一些差别,下面总结了一点。
(1)Popupwindow在显示之前一定要设置宽高,Dialog无此限制。
(2)Popupwindow默认不会响应物理键盘的back,除非显示设置了popup.setFocusable(true);而在点击back的时候,Dialog会消失。
(3)Popupwindow不会给页面其他的部分添加蒙层,而Dialog会。
(4)Popupwindow没有标题,Dialog默认有标题,可以通过dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);取消标题
(5)二者显示的时候都要设置Gravity。如果不设置,Dialog默认是Gravity.CENTER。
(6)二者都有默认的背景,都可以通过setBackgroundDrawable(new ColorDrawable(android.R.color.transparent));去掉。
其中最本质的差别就是:AlertDialog是非阻塞式对话框:AlertDialog弹出时,后台还可以做事情;而PopupWindow是阻塞式对话框:PopupWindow弹出时,程序会等待,在PopupWindow退出前,程序一直等待,只有当我们调用了dismiss方法的后,PopupWindow退出,程序才会向下执行。这两种区别的表现是:AlertDialog弹出时,背景是黑色的,但是当我们点击背景,AlertDialog会消失,证明程序不仅响应AlertDialog的操作,还响应其他操作,其他程序没有被阻塞,这说明了AlertDialog是非阻塞式对话框;PopupWindow弹出时,背景没有什么变化,但是当我们点击背景的时候,程序没有响应,只允许我们操作PopupWindow,其他操作被阻塞。
我们在写程序的过程中可以根据自己的需要选择使用Popupwindow或者是Dialog。

android中的对话框怎样让他自动消失
提示:

android中的对话框怎样让他自动消失

public class MyDialog extends Dialog {
private int FLAG_DISMISS = 1;
private boolean flag = true;

public MyDialog(Context context) {
super(context);
setTitle("自动消失对话框测试!");
}

@Override
public void show() {
super.show();
mThread.start();
}

@Override
public void dismiss() {
super.dismiss();
flag = false;
}

private Thread mThread = new Thread(){
@Override
public void run() {
super.run();
while(flag){
try {
Thread.sleep(2000);
Message msg = mHandler.obtainMessage();
msg.what = FLAG_DISMISS;
mHandler.sendMessage(msg);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};

private Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if(msg.what == FLAG_DISMISS)
dismiss();
}

};

}

LZ 筒子,AlertDialog都被框死用来做警告用的,不好操作。想实现自己的对话框还是继承Dialog然后DIY更好,选择也多得多了。我这个自定义的Dialog就是显示了2s然后消失的,测试过没问题。实现起来也相当之简单,抛砖引玉,期待更好的方法。