自定义一个简单的加载对话框

2,989 阅读2分钟

提醒:样式可以按下面的创建对话框代码写,其他的忽略即可(例如静态引用 Context),会造成内存泄漏,自己在 Activity 里随便封装个方法就行了。

在公司项目遇到了这么一个小需求,在加载网页的时候显示一个进度条,让用户知道目前正在加载中,因为如果没有进度条,恰好某些用户网速比较慢,那么在加载网页的过程中,屏幕画面会定在跳转前的画面,这样就会给用户造成卡顿感,这是非常不好的,所以这么一个小需求现在就简单的做一下吧。

目前实现的效果是这样的:

为了实现对话框显示时不可通过点击对话框外部或者点按返回键取消,我选择的是直接用Dialog创建一个对话框对象,为什么不直接用ProgressDialog呢?因为感觉直接用Dialog自由一些,根据自己需求吧,接下来开始分解步骤,很简单。

1. 先写好对话框的背景文件

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">

    <corners android:radius="5dp" />

    <solid android:color="@color/bg_dialog" />

</shape>

2. 编写对话框需要的控件内容,这里的对话框用到的是ProgressBarTextView ,将上面写好的背景设置给根布局,其他参数根据需要调整

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/bg_dialog"
    android:orientation="vertical"
    android:paddingStart="20dp"
    android:paddingTop="10dp"
    android:paddingEnd="20dp"
    android:paddingBottom="10dp">

    <ProgressBar
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:scaleX="0.5"
        android:scaleY="0.5" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp"
        android:text="@string/dialog_progress_hint"
        android:textColor="#FFFFFFFF" />

</LinearLayout>

3. 创建Dialog对象并初始化属性,这里我是封装起来了,因为不止一个Activity用到,封装起来也方便些

public class DialogUtil {

    private static Dialog sDialog;

    public static void showProgress(Context context) {
        if (sDialog == null) init(context);
        sDialog.show();
    }

    public static void dismissProgress() {
        if (sDialog.isShowing()) sDialog.dismiss();
    }

    private static void init(Context context) {
        sDialog = new Dialog(context);
        // 修改对话框默认背景为透明,因为不这么设置的话,对话框默认是白色的
        // 然后你自定义的背景是黑色且有圆角,相信我,你不想看到的
        Window window = sDialog.getWindow();
        if (window != null) window.setBackgroundDrawableResource(android.R.color.transparent);
        // 设置自己编写的布局文件,即刚才有 ProgressBar 和 TextView 的那个布局文件
        sDialog.setContentView(R.layout.dialog_progress);
        // 设置不可点击或点按返回键取消对话框,这样相当于禁止了用户与界面的交互
        // 实际情况根据需求而定
        sDialog.setCancelable(false);
//        sDialog.setCanceledOnTouchOutside(false);
    }
}

4. 接下来只要在需要用到的地方,调用DialogUtil.showProgress(context)DialogUtil.dismissProgress()就能显示对话框了,到这里就结束了。

  • 如果有更好的实现方法,请告诉我,这篇文章的主要目的也只是记录下自己在学习路上所遇到的一些解决问题的方法,如果还能帮助到大家,那是再好不过了。