美文网首页Android天地
Android之ProgressDialog与自定义Loadin

Android之ProgressDialog与自定义Loadin

作者: 阿Q说代码 | 来源:发表于2019-04-12 14:50 被阅读6次

    最近呢一直进行Android项目的开发。开发过程中发现,以前的好多知识点都想不起来了,都得先去Google一下,进展缓慢,耗时又耗力,所以决定将开发中的知识点慢慢总结下来,以便日后查验。大家在进行网络请求数据的时候(尤其是第一次),是不是也会遇到数据量较大,请求时间较长的情况呢?在这中情况下,如果一味的让用户默默的等待,不给用户以提示信息,用户很可能就会产生厌烦的情绪,影响用户体验。今天呢,阿Q就给大家讲一下项目中用到的加载框吧!

    首先呢,先讲一下阿Q最先想到的ProgressDialog的用法吧,查阅Android API发现,此类在API 26中已经被弃用了。它给出了这样的解释:ProgressDialog是一个模拟对话框,可防止用户与应用程序进行交互。您应该使用类似的进度指示器ProgressBar,而不是使用此类,可以将其嵌入到应用程序的UI中。或者,您可以使用通知来通知用户任务的进度。虽然它已经被无情抛弃了,但是阿Q呢还是想研究一下它的用法,只当是积累知识了。ProgressDialog继承自AlertDialog,而AlertDialog继承自DialogProgressDialog的使用方法有两种,一种是直接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);
    

    接下来呢就给大家附上手机效果展示图:


    ezgif.com-video-to-gif.gif

    好了自定义Dialog就先说到这了,想了解更多学习知识,请关注微信公众号“阿Q说”。你也可以后台留言说出你的疑惑或者输入“源码”获取代码,阿Q将会在后期的文章中为你解答。每天学习一点点,每天进步一点点。

    相关文章

      网友评论

        本文标题:Android之ProgressDialog与自定义Loadin

        本文链接:https://www.haomeiwen.com/subject/tcycwqtx.html