概述:Android中Dialog的用途,主要用来给出弹窗提示,如表示后台处理耗时任务(网络连接等)的进度。区别于PopupWindow。Dialog是非阻塞线程的,Dialog弹出的时候,后台可是还可以做其他事情。 而PopupWindow是阻塞线程的, 这就意味着在我们退出这个弹出框之前,程序会一直等待。下面给出一个登录时表示进度的弹窗来简单说明dialog的用法。
一.定义dialog所需的布局xml和样式文件style
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="42dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:background="#000000"
android:gravity="center"
android:orientation="horizontal" >
<ProgressBar
android:layout_width="18dp"
android:layout_height="18dp"
android:indeterminateDrawable="@drawable/progressbar_anim" />
<!-- 使用自定义旋转图 -->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:text="@string/loading"
android:textColor="@color/white"
android:textSize="13sp" />
</LinearLayout></span>
<?xml version="1.0" encoding="UTF-8"?>
<animated-rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/common_loading2_0"
android:pivotX="50%"
android:pivotY="50%" >
</animated-rotate>
<style name="loginingDlg" parent="@android:style/Theme.Dialog">
<item name="android:windowIsFloating">true</item>
<!-- 设置窗口浮动 -->
<item name="android:windowFrame">@null</item>
<!-- 设置无边框 -->
<item name="android:windowNoTitle">true</item>
<!-- 设置无标题 -->
<item name="android:windowBackground">@android:color/transparent</item>
<!-- 设置背景颜色 透明 -->
<item name="android:backgroundDimEnabled">true</item>
<!-- 是否模糊 -->
<item name="android:windowIsTranslucent">true</item>
<!-- 半透明 -->
</style>
二.在要展示进度的页面中实例化dialog
mLoginingDlg = new Dialog(this, R.style.loginingDlg);
mLoginingDlg.setContentView(R.layout.logining_dlg);
Window window = mLoginingDlg.getWindow();
WindowManager.LayoutParams params = window.getAttributes();// 获取和mLoginingDlg关联的当前窗口的属性,从而设置它在屏幕中显示的位置
// 获取屏幕的高宽
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
int cxScreen = dm.widthPixels;
int cyScreen = dm.heightPixels;
int height = (int) getResources().getDimension(
R.dimen.loginingdlg_height);// 高42dp
int topMargin = (int) getResources().getDimension(
R.dimen.loginingdlg_top_margin); // 上沿20dp
params.y = (-(cyScreen - height) / 2) + topMargin; // -199
/* 对话框默认位置在屏幕中心,所以x,y表示此控件到"屏幕中心"的偏移量 */
params.width = cxScreen;//让dialog的宽度为window的宽度
params.height = height;
// width,height表示mLoginingDlg的实际大小
mLoginingDlg.setCanceledOnTouchOutside(true); // 设置点击Dialog外部任意区域关闭Dialog
三.在耗时任务之前显示,之后dismiss
/* 显示正在登录对话框 */
private void showLoginingDlg() {
if (mLoginingDlg != null)
mLoginingDlg.show();
}
/* 关闭正在登录对话框 */
private void closeLoginingDlg() {
if (mLoginingDlg != null && mLoginingDlg.isShowing())
mLoginingDlg.dismiss();
}
View menuView = LayoutInflater.from(getActivity()).inflate(
R.layout.pop_menu,null);
operateMenu =new PopupWindow(menuView, LayoutParams.MATCH_PARENT,
LayoutParams.WRAP_CONTENT);
operateMenu.setTouchable(true);
operateMenu.setFocusable(true);
operateMenu.setOutsideTouchable(true);
// 这个是为了点击“返回Back”也能使其消失,并且并不会影响你的背景
operateMenu.setBackgroundDrawable(newBitmapDrawable());
operateMenu.setTouchInterceptor(new OnTouchListener() {
publicboolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {
operateMenu.dismiss();
return true;
}
return false;
}
});
//位置自己控制
operateMenu.showAtLocation(v, Gravity.NO_GRAVITY, location[0],
location[1] + parentHeight + 5);
另外: int [] location = new int [2]; view.getLocationOnScreen(location);可以获得view的位置