简单的封装,做个笔记,大神绕过!当然,有好的建议欢迎提出,若有不足请指教。
目的:每次请求网络时,一般都会有个progress的弹窗显示,让用户清除我们正在连接加载网络,而不是无反应。
实现就直接先上图,再上代码了,界面一点都不丑
重写的callback
/** * @author zgq * @version 1.0 * @describe -- 重写callBack ,统一dialog * @date 2018/5/5 */ public class DialogCallBack extends StringCallback { private String tag_log = "DialogCallBack"; LoadingDialog dialog; private Context context; private boolean isShowDialog;//是否显示dialog private boolean isCancel;//是否能返回键取消,默认能 private Object tag;//用于取消网络连接 /** * * @param context * @param isShowDialog 是否显示dialog * @param tag 用于取消网络连接 * @param isCancel 是否能返回键取消,默认能 */ public DialogCallBack(Context context, boolean isShowDialog, Object tag, boolean isCancel){ this.context = context; this.isShowDialog = isShowDialog; this.tag = tag; this.isCancel = isCancel; } public DialogCallBack(Context context, boolean isShowDialog, Object tag){ this.context = context; this.isShowDialog = isShowDialog; this.tag = tag; isCancel = true; } public DialogCallBack(Context context, boolean isShowDialog){ this.context = context; this.isShowDialog = isShowDialog; isCancel = true; } @Override public void onStart(Request<String, ? extends Request> request) { super.onStart(request); if (isShowDialog){
dialog = LoadingDialog.showprogress(context, isCancel);dialog.setOnCancelListener( new DialogInterface.OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { if ( tag != null){ LogUtils. i( tag_log+ "取消网络请求") ; OkGo. getInstance().cancelTag( tag) ; } } }) ; } } @Override public void onSuccess(Response<String> response) { LogUtils. i( tag_log + "onSuccess:") ; } @Override public void onFinish() { super.onFinish() ; LogUtils. i( tag_log + "onFinish:") ; if ( dialog != null && dialog.isShowing()){ dialog.dismiss() ; dialog = null; } } @Override public void onError(Response<String> response) { super.onError(response) ; LogUtils. i( tag_log + "onError:"+response.body()) ; }
其中的LoadingDialog.class\
/** * @author zgq * @version 1.0 * @describe -- 网络的等待dialog * @date 2018/5/31 */ public class LoadingDialog extends Dialog{ private static LoadingDialog mLoadingProgress; public LoadingDialog(Context context) { super(context); } public LoadingDialog(Context context, int theme) { super(context, theme); }//这个消息文字,根据自己需要加吧 public static LoadingDialog showprogress(Context context,CharSequence message,boolean iscanCancel){ mLoadingProgress=new LoadingDialog(context, R.style.loading_dialog);//自定义style主要让背景变成透明并去掉标题部分 //触摸外部无法取消,必须(根据自己需要吧) mLoadingProgress.setCanceledOnTouchOutside(false); mLoadingProgress.setTitle(""); mLoadingProgress.setContentView(R.layout.loading_layout); mLoadingProgress.getWindow().setBackgroundDrawableResource(android.R.color.transparent); if(message==null|| TextUtils.isEmpty(message)){ mLoadingProgress.findViewById(R.id.loading_tv).setVisibility(View.GONE); }else { TextView tv = (TextView) mLoadingProgress.findViewById(R.id.loading_tv); tv.setText(message); } //按返回键响应是否取消等待框的显示 mLoadingProgress.setCancelable(iscanCancel); mLoadingProgress.show(); return mLoadingProgress; } public static LoadingDialog showprogress(Context context,boolean iscanCancel){ mLoadingProgress=new LoadingDialog(context, R.style.loading_dialog);//自定义style主要让背景变成透明并去掉标题部分 mLoadingProgress.setCanceledOnTouchOutside(false); mLoadingProgress.setTitle(""); mLoadingProgress.setContentView(R.layout.loading_layout); mLoadingProgress.getWindow().setBackgroundDrawableResource(android.R.color.transparent); mLoadingProgress.findViewById(R.id.loading_tv).setVisibility(View.GONE); mLoadingProgress.setCancelable(iscanCancel); mLoadingProgress.show(); return mLoadingProgress; } public static LoadingDialog showprogress(Context context){ mLoadingProgress=new LoadingDialog(context, R.style.loading_dialog); mLoadingProgress.setCanceledOnTouchOutside(false); mLoadingProgress.setTitle(""); mLoadingProgress.setContentView(R.layout.loading_layout); mLoadingProgress.getWindow().setBackgroundDrawableResource(android.R.color.transparent); mLoadingProgress.findViewById(R.id.loading_tv).setVisibility(View.GONE); mLoadingProgress.setCancelable(true); mLoadingProgress.show(); return mLoadingProgress; } public static void dismissprogress(){ if(mLoadingProgress!=null){ mLoadingProgress.dismiss(); } } }
代码都很简单,其中的stay
<style name="loading_dialog" parent="Widget.AppCompat.ProgressBar"> <item name="android:windowNoTitle">true</item> <item name="android:background">@android:color/transparent</item> <!--弹出框时背景是否变暗--> <item name="android:backgroundDimEnabled">false</item> <item name="android:windowIsFloating">true</item> <item name="android:windowIsTranslucent">true</item> </style>
dialog布局loading_layout
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="@dimen/dp_100" android:layout_height="@dimen/dp_100" android:background="@drawable/ret_loading_corner" android:gravity="center" android:orientation="vertical"> <!--用于改变圆圈的颜色--> <ProgressBar android:id="@+id/loading_pb" android:layout_width="wrap_content" android:layout_height="wrap_content" android:indeterminateTint="@color/white" android:indeterminateTintMode="src_atop" /> <TextView android:id="@+id/loading_tv" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:text="正在加载..." android:textColor="@color/white" android:textSize="14sp" android:layout_marginTop="@dimen/dp_5" android:visibility="gone"/> </LinearLayout>
布局中的ret_loading_corner
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="@color/loading_bg"/> <corners android:radius="@dimen/dp_10"/> <stroke android:color="@color/gray_bc" android:dashWidth="@dimen/dp_0.5"/> </shape>
这个loading_bg颜色就是一个灰色的半透明颜色
然后是使用实例。根据重写相应的方法,调用请求时自动弹窗,结束后自动消失。手动取消dialog则取消此次网络请求。
OkGo.<String>get("") .tag(this) .params("","") .execute(new DialogCallBack(this, true, MainActivity.this, true){ @Override public void onSuccess(Response<String> response) { super.onSuccess(response); } @Override public void onFinish() { super.onFinish(); } });嗯。。。。就这么多代码。本人目的单纯的做个笔记。同时希望能对需要的人有所帮助