最近呢一直进行Android项目的开发。开发过程中发现,以前的好多知识点都想不起来了,都得先去Google一下,进展缓慢,耗时又耗力,所以决定将开发中的知识点慢慢总结下来,以便日后查验。大家在进行网络请求数据的时候(尤其是第一次),是不是也会遇到数据量较大,请求时间较长的情况呢?在这中情况下,如果一味的让用户默默的等待,不给用户以提示信息,用户很可能就会产生厌烦的情绪,影响用户体验。今天呢,阿Q就给大家讲一下项目中用到的加载框吧!
首先呢,先讲一下阿Q最先想到的ProgressDialog
的用法吧,查阅Android API发现,此类在API 26中已经被弃用了。它给出了这样的解释:ProgressDialog
是一个模拟对话框,可防止用户与应用程序进行交互。您应该使用类似的进度指示器ProgressBar
,而不是使用此类,可以将其嵌入到应用程序的UI中。或者,您可以使用通知来通知用户任务的进度。虽然它已经被无情抛弃了,但是阿Q呢还是想研究一下它的用法,只当是积累知识了。ProgressDialog
继承自AlertDialog
,而AlertDialog
继承自Dialog
。ProgressDialog
的使用方法有两种,一种是直接New ProgressDialog
,一种是调用ProgressDialog
的静态方法show。接下来就让代码说话吧。
第一种方式
final ProgressDialog pd = new ProgressDialog(MainActivity.this); //设置标题 pd.setTitle("我是加载框"); //设置提示信息 pd.setMessage("正在加载..."); //设置ProgressDialog 是否可以按返回键取消; pd.setCancelable(true); pd.setCanceledOnTouchOutside(false);// 设置在点击Dialog外是否取消Dialog进度条 //显示ProgressDialog pd.show(); //模拟请求数据 handler.postDelayed(new Runnable() { @Override public void run() { //删除progressdialog,cancel与dismiss作用相同。加载完成取消dialog pd.cancel(); } },2000);
其他的常用方法:
//设置进度条风格,STYLE_HORIZONTAL为水平的,默认为STYLE_SPINNER, setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); //设置标题图标: setIcon(R.drawable.ic_launcher); //设置ProgressDialog 的进度条是否不明确;这个属性对于ProgressDailog默认的转轮模式没有实际意义, 默认下设置为true,它仅仅对带有ProgressBar的Dialog有作用。修改这个属性为false后可以实时更新进度条的进度。 setIndeterminate(boolean flag): //当前Dialog强制取消之后将会被执行,通常用来清理未完成的任务。 setOnCancelListener() //设置ProgressDialog 的一个Button(需要监听Button事件); setButton() //设置最大进度条的值 setMax(int)、getMax() //更新进度条,当然一般都需要Handler的结合来更新进度条 setProgress(int)、getProgress //增加进度条 incrementProgressBy(int) //设置progress发生变化时的进度指示条的背景图 setProgressDrawable()
第二种方式:
final ProgressDialog pd2 = ProgressDialog.show(MainActivity.this,"刷新","刷新中..."); //模拟请求数据 handler.postDelayed(new Runnable() { @Override public void run() { //加载完成取消dialog pd2.dismiss(); } },2000);
show方法参数讲解:
show(Context context, CharSequence title, CharSequence message, boolean indeterminate, boolean cancelable, OnCancelListener cancelListener); context:上下文; title:加载框标题 message:加载框提示信息 indeterminate:是否处于不确定模式 cancelable:是否可以按返回键取消 cancelListener:监听进度条被取消的操作
接下来呢,阿Q就给大家制作一个自定义的Dialog
,直接上代码
//1,创建LoadingDialog继承Dialog并实现构造方法 public class LoadingDialog extends Dialog{ public LoadingDialog(@NonNull Context context) { super(context); } public LoadingDialog(@NonNull Context context, int themeResId) { super(context, themeResId); } protected LoadingDialog(@NonNull Context context, boolean cancelable, @Nullable OnCancelListener cancelListener) { super(context, cancelable, cancelListener); } //2,创建静态内部类Builder,将dialog的部分属性封装进该类 public static class Builder{ private Context context; //提示信息 private String message; //是否展示提示信息 private boolean isShowMessage=true; //是否按返回键取消 private boolean isCancelable=true; //是否取消 private boolean isCancelOutside=false; public Builder(Context context) { this.context = context; } /** * 设置提示信息 * @param message * @return */ public Builder setMessage(String message){ this.message=message; return this; } /** * 设置是否显示提示信息 * @param isShowMessage * @return */ public Builder setShowMessage(boolean isShowMessage){ this.isShowMessage=isShowMessage; return this; } /** * 设置是否可以按返回键取消 * @param isCancelable * @return */ public Builder setCancelable(boolean isCancelable){ this.isCancelable=isCancelable; return this; } /** * 设置是否可以取消 * @param isCancelOutside * @return */ public Builder setCancelOutside(boolean isCancelOutside){ this.isCancelOutside=isCancelOutside; return this; } //创建Dialog public LoadingDialog create(){ LayoutInflater inflater = LayoutInflater.from(context); View view=inflater.inflate(R.layout.dialog_loading,null); //设置带自定义主题的dialog LoadingDialog loadingDailog=new LoadingDialog(context,R.style.MyDialogStyle); TextView msgText= (TextView) view.findViewById(R.id.tipTextView); if(isShowMessage){ msgText.setText(message); }else{ msgText.setVisibility(View.GONE); } loadingDailog.setContentView(view); loadingDailog.setCancelable(isCancelable); loadingDailog.setCanceledOnTouchOutside(isCancelOutside); return loadingDailog; } } }
客户端代码:
LoadingDialog.Builder builder=new LoadingDialog.Builder(MainActivity.this) .setMessage("加载中...") .setCancelable(false); final LoadingDialog dialog=builder.create(); dialog.show(); handler.postDelayed(new Runnable() { @Override public void run() { dialog.dismiss(); } },2000);
接下来呢就给大家附上手机效果展示图: