Android中Popupwindow和Dialog的区别
PopupWindow和Dialog可以实现同样的效果,默认情况下Dialog可以快速创建对应的dialog对话窗口,只需要简单的几句话:创建DialogAlertDialog mDialog = null; mDialog = new AlertDialog.Builder(this).create();; mDialog.setIcon(R.drawable.ic_launcher); mDialog.setTitle("系统提示"); mDialog.setMessage("你确定要退出吗?"); mDialog.setButton(DialogInterface.BUTTON_POSITIVE,"确定",null); mDialog.setButton(DialogInterface.BUTTON_NEGATIVE,"取消", null); mDialog.show();PopupWindow创建:需要获取对应的ViewView popupWindow_view = getLayoutInflater().inflate(R.layout.activity_popupwindow_left, null, false); popupWindow = new PopupWindow(popupWindow_view, 200, LayoutParams.MATCH_PARENT, true);PopupWindow创建过程没有Dialog那么方便,Dialog创建对象后,设置对应的Title、Message、Button即可;PopupWindow可以创建的弹窗从当前视图的上下左右方向弹出,效果和Dialog居中显示有所区别
android中Dialog和PopupWindow的区别
1. Android的对话框有两种:PopupWindow和AlertDialog。 它们的不同点在于:AlertDialog的位置固定,而PopupWindow的位置可以随意AlertDialog是非阻塞线程的,AlertDialog弹出的时候,后台可是还可以做其他事情的哦。 而PopupWindow是阻塞线程的, 这就意味着在我们退出这个弹出框之前,程序会一直等待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);
如何正确地使用android中的progressdialog
其核心代码:
Handler handler = new Handler();
Runnable mTasks = new Runnable() {
public void run() {
//执行url获取内容*作
}
};
final ProgressDialog myDialog = ProgressDialog.show(YourClass.this, "正在连接服务器..", "连接中,请稍后..", true, true);
handler.post(mTasks);
我实际使用后的效果是:点击按钮后(我是把这一系列*作放在一个clicklistener里)UI界面就阻塞在那里,然后等task执行完毕之后才显示progressdialog并且一直会存在(当然如果你在这个task结束后添加一条dialog.dismiss语句就会发现progressdialog显示后立即就消失了,但是这个不是本文的重点)我在stackoverflow上发现不少人有同样的问题,但是并没有找到正确的答案,只是有人给出了asynctask类的方案(我没有实际使用这个方案,但是根据我最后的理解,这种方案应该也是可行的)
这个问题困扰了我一个下午的时间,要解释这个问题,就要简单说一下android的UI线程,android程序启动时,会启动一个对应的主线程(就是UI线程),这个线程负责和用户的交互(例如按下按钮,滑动等),我们只能在UI线程中访问android UI 工具包。
但是对于一些很耗时的*作,如果我们在主线程里完成的话,主线程就不能响应用户的*作,这样就会产生类似windows程序失去响应的效果,所以大部分时候我们都会启动一个新的线程执行这些*作,但是要注意在新的线程里是不能修改UI界面的(只能在UI线程里修改UI界面)。
比如说我们想下载一个url的html内容,然后显示在界面的一个Textview上,我们如果在新启动的线程里调用textview.settext()方法是不会生效的。
说了这么多,是为了说明handler的作用就是为了在其他线程里更新UI。比如我们如果用handler.post(run) (run的内容就是更新在textview)的话,就可以实现我们的目的。
回到正题,我们如果按照前述代*使用progressdialog的话,在执行完
final ProgressDialog myDialog = ProgressDialog.show(YourClass.this, "正在连接服务器..", "连接中,请稍后..", true, true);
这条语句之后
handler.post(mTasks);
这条语句虽然看起来是在mtask这个线程里执行,但是因为使用了handler类,所以效果实际还是等同于阻塞了UI线程。所以progressdialog就等到mtask执行完毕之后才显示了。因此我们正确的写法应该是这样的:
final ProgressDialog myDialog = ProgressDialog.show(YourClass.this, "正在连接服务器..", "连接中,请稍后..", true, true);
new Thread(){
public void run() {
//执行url获取内容*作
handle.post( //在这里面更新textview);
}
}.start();
最后如果希望在新线程执行完之后让progressdialog自动消失的话,就在新线程里利用handler执行dialog.dismiss()。这个内容在本文开头的链接里也有详细的介绍,在这里就不赘述了。