您的位置:首页 > 移动开发 > Android开发

Android ProgressDialog工具类

2015-07-20 10:36 525 查看


以前和大家讲过一次,但是没贴图,这次我整理下,重新书写下。

首先,创建一个布局,这个布局我用到了cardView。大家可以考虑可以不用。loading.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
card_view:cardBackgroundColor="@color/color_white_stranspate"
card_view:cardCornerRadius="10dp"
card_view:cardElevation="0dp" >

<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal"
android:paddingBottom="10dp"
android:paddingLeft="20dp"
android:paddingRight="20dp"
android:paddingTop="10dp" >

<ProgressBar
android:id="@+id/loading_animato"
style="@style/loading"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

<TextView
android:id="@+id/loading_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:gravity="center"
android:textSize="14sp" />
</LinearLayout>

</android.support.v7.widget.CardView>


color_white_stranspate 的色值#F6F3EE

然后在Style.xml中配置loading和dialog属性

<!-- 加载滚动条样式 -->
<style name="loading">
<item name="android:indeterminate">true</item>
<item name="android:indeterminateDrawable">@drawable/progressloading</item>
<item name="android:indeterminateDuration">1200</item>
<item name="android:indeterminateOnly">true</item>
</style>

<!-- 配置dialog样式 -->
<style name="dialog" parent="@android:style/Theme.Dialog">
<item name="windowActionBar">false</item>
<item name="android:windowFrame">@null</item>
<item name="android:windowIsFloating">true</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:popupBackground">@android:color/transparent </item>
<item name="android:background">@android:color/transparent </item>
<item name="android:windowBackground"> @android:color/transparent </item>
<!-- <item name="android:backgroundDimEnabled">true</item> -->
</style>


在drawable文件夹中,创建progressloading.xml

<?xml version="1.0" encoding="utf-8"?>

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >

<item>
<rotate
android:fromDegrees="0"
android:interpolator="@android:anim/linear_interpolator"
android:pivotX="50%"
android:pivotY="50%"
android:toDegrees="360" >
<bitmap
android:antialias="true"
android:filter="true"
android:src="@drawable/loading" />
</rotate>
</item>

</layer-list>


其中loading图片大家选择一张。就是只要一张如上图的图片就ok了。

这些完成后,我们奉上我们的dialog加载框工具类。

/**
* @类名:ProgressDialogUtil
* @类描述:pdf Reader全局加载框
*/
public class ProgressDialogUtil {
private static final int START_DIALOG = 0;//开始对话框
private static final int UPDATE_DIALOG = 1;//更新对话框
private static final int STOP_DIALOG = 2;//销毁对话框
private static AlertDialog dialog = null;
private static TextView title = null;
private static Context context = null;

private static Handler handler = new Handler(Looper.getMainLooper()) {
public void handleMessage(android.os.Message msg) {
String message = "";
switch (msg.what) {
case START_DIALOG:// 启动加载框
message = (String) msg.obj;
if (dialog != null) {
stopLoad();
startLoad(message);
return;
}
init(message);
isTouchDismiss(true);
break;
case UPDATE_DIALOG:// 更新加载框
message = (String) msg.obj;
if (title.VISIBLE == View.VISIBLE) {
if (StringUtils.isEmpty(message)) {
title.setVisibility(View.GONE);
} else {
title.setText(message);
}
} else {
if (!StringUtils.isEmpty(message)) {
title.setText(message);
title.setVisibility(View.VISIBLE);
}
}
break;
case STOP_DIALOG:// 停止加载框
if (dialog != null) {
dialog.dismiss();
dialog.cancel();
dialog = null;
title = null;
}
break;
}
};
};

/**
* @方法说明:加载控件与布局
* @方法名称:init
* @返回值:void
*/
private static void init(String mssg) {
if (SystemTool.isBackground(context)) {// 如果程序在后台,则不加载
return;
}

if (null != context) {
LayoutInflater flat = LayoutInflater.from(context);
View v = flat.inflate(R.layout.loading, null);
// v.setBackgroundColor(context.getResources().getColor(android.R.color.transparent));
// 创建对话
dialog = new AlertDialog.Builder(context, R.style.dialog).create();
// 设置返回键点击消失对话框
dialog.setCancelable(true);
// 设置点击返回框外边不消失
dialog.setCanceledOnTouchOutside(true);
// 给该对话框增加系统权限
// dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
// 显示对话
dialog.show();

// 加载控件
title = (TextView) v.findViewById(R.id.loading_title);

if (StringUtils.isEmpty(mssg)) {
title.setVisibility(View.GONE);
} else {
title.setVisibility(View.VISIBLE);
title.setText(mssg);
}

// 必须放到显示对话框下面,否则显示不出效果
Window window = dialog.getWindow();
// window.getAttributes().x = 0;
// window.getAttributes().y = 0;//设置y坐标

WindowManager.LayoutParams params = window.getAttributes();
params.width = ViewGroup.LayoutParams.WRAP_CONTENT;
params.height = ViewGroup.LayoutParams.WRAP_CONTENT;
params.gravity = Gravity.CENTER;
// params.alpha = 0.6f;
window.setAttributes(params); // 加载布局组件
dialog.getWindow().setContentView(v);
}
}

/**
* @方法说明:启动对话框
* @方法名称:startLoad
* @param con
* @param msg
* @返回值:void
*/
public static void startLoad(String msg) {
context = ActivityManager.newInstance().currentActivity();// 获取当前的activity的上下文
if (context == null) {
return;
}
if (SystemTool.isBackground(context)) {// 如果程序在后台,则不加载
return;
}

Message mssage = new Message();
mssage.what = START_DIALOG;
mssage.obj = msg;
handler.sendMessage(mssage);
}

/**
* @方法说明:更新显示的内容
* @方法名称:UpdateMsg
* @param msg
* @返回值:void
*/
public static void UpdateMsg(String msg) {
Message message = new Message();
message.what = UPDATE_DIALOG;
message.obj = msg;
handler.sendMessage(message);
}

/**
* @方法说明:允许加载条转动的时候去点击系统返回键
* @方法名称:openCancelable
* @param flag
* @返回值:void
*/
public static void openCancelable(boolean flag) {
if (dialog != null) {
dialog.setCancelable(flag);
}
}

/**
* @方法说明:允许点击对话框触摸消失
* @方法名称:isTouchDismiss
* @param isdimiss
* @返回值:void
*/
public static void isTouchDismiss(boolean isdimiss) {
if (dialog != null) {
dialog.setCanceledOnTouchOutside(isdimiss);
}
}

/**
* @方法说明:让警告框消失
* @方法名称:dismiss
* @返回值:void
*/
public static void stopLoad() {
handler.sendEmptyMessage(STOP_DIALOG);
}

}


/**
* @方法说明:判断当前应用程序是否后台运行
* @方法名称:isBackground
* @param context
* @return
* @返回值:boolean
*/
public static boolean isBackground(Context context) {
ActivityManager activityManager = (ActivityManager) context
.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> appProcesses = activityManager
.getRunningAppProcesses();
for (ActivityManager.RunningAppProcessInfo appProcess : appProcesses) {
if (appProcess.processName.equals(context.getPackageName())) {
if (appProcess.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_BACKGROUND) {
// 后台运行
return true;
} else {
// 前台运行
return false;
}
}
}
return false;
}


关于ActivityManager.newInstance().currentActivity();其实大家可以从外部传进来就可以了,这个就是上下文。

改成这样就可以了:

ProgressDialogUtil.startLoad(Context context, String message);

不过切记这个context,必须是activity类型的上下文,或者FragmentActivity类型的上下文。

最后,当大家在你向需要用到的时候,你只需要

ProgressDialogUtil.startLoad(“”);//只显示菊花,不显示文本

ProgressDialogUtil.startLoad(“刷新中…”);//显示菊花,显示文本

当你用完后,需要停止的时候,只要这样调用就可以了:

ProgressDialogUtil.stopLoad();

如果你不想stop掉它,而是更新dialog的显示文本内容:

ProgressDialogUtil.UpdateMsg(“更新了…”);

是不是很简单,有很方便啊!

补充下:

如果你想自动dialog位置的话,可以如下操作:

// 必须放到显示对话框下面,否则显示不出效果
Window window = dialog.getWindow();
WindowManager.LayoutParams params = window.getAttributes();
int width = Math.min(ScreenUtil.getScreenWidth(context), ScreenUtil.getScreenHeight(context)) * 3 / 5;
params.width = width;
params.height = ViewGroup.LayoutParams.WRAP_CONTENT;
// params.gravity = Gravity.LEFT | Gravity.TOP;
params.gravity = Gravity.LEFT | Gravity.BOTTOM;
params.horizontalMargin = 0.05F;
params.verticalMargin = 0.1F;
// params.x = ScreenUtil.dip2px(context, 15);
// params.y = ScreenUtil.getScreenHeight(context) -
// ScreenUtil.dip2px(context, 345) - parentHeight;
window.setAttributes(params);
// 加载布局组件
dialog.getWindow().setContentView(v);


同时你要是好像自定义dialog的style的话,可以如下操作:

<style name="dialogtrasparent" parent="@android:style/Theme.Dialog">
<item name="windowActionBar">false</item><!-- 无actionBar -->
<item name="android:windowFrame">@null</item><!-- 是否有边框 -->
<item name="android:windowIsFloating">true</item><!-- 是否浮现在activity之上 -->
<item name="android:windowIsTranslucent">false</item><!-- 对话框是否透明 -->
<item name="android:windowNoTitle">true</item><!-- 无标题 -->
<item name="android:windowContentOverlay">@null</item><!-- 对话框是否有遮盖 -->
<item name="android:windowBackground"> @null</item><!-- 此对话框的背景 -->
<item name="android:backgroundDimEnabled">false</item><!-- 否允许对话框的背景变暗 -->
</style>


详细的注释我已经添加了,想必应该没有不懂得了!呵呵
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: