Android 中中怎么使用ProgressDialog实现进度条

发布时间:2021-06-28 15:53:39 作者:Leah
阅读:252
Android开发服务器,限时0元免费领! 查看>>
# Android 中怎么使用ProgressDialog实现进度条

## 目录
1. [ProgressDialog概述](#1-progressdialog概述)  
2. [基本用法](#2-基本用法)  
   2.1 [创建ProgressDialog](#21-创建progressdialog)  
   2.2 [设置样式与属性](#22-设置样式与属性)  
3. [进度条类型详解](#3-进度条类型详解)  
   3.1 [不确定进度条](#31-不确定进度条)  
   3.2 [确定进度条](#32-确定进度条)  
4. [自定义ProgressDialog](#4-自定义progressdialog)  
   4.1 [自定义布局](#41-自定义布局)  
   4.2 [样式主题修改](#42-样式主题修改)  
5. [线程与异步处理](#5-线程与异步处理)  
   5.1 [Handler实现](#51-handler实现)  
   5.2 [AsyncTask实现](#52-asynctask实现)  
6. [替代方案与最佳实践](#6-替代方案与最佳实践)  
   6.1 [ProgressBar替代方案](#61-progressbar替代方案)  
   6.2 [Material Design组件](#62-material-design组件)  
7. [常见问题与解决方案](#7-常见问题与解决方案)  
8. [完整代码示例](#8-完整代码示例)  

---

## 1. ProgressDialog概述

ProgressDialog是Android提供的一个模态对话框,用于在后台任务执行时向用户显示进度反馈。虽然Google官方已建议使用`ProgressBar`或`AlertDialog`替代(API 26+),但在兼容旧版本时仍具实用价值。

**核心特性**:
- 支持不确定进度(旋转圆圈)
- 支持确定进度(水平进度条)
- 可自定义标题、消息和图标

---

## 2. 基本用法

### 2.1 创建ProgressDialog

```java
// 基础创建示例
ProgressDialog progressDialog = new ProgressDialog(context);
progressDialog.setMessage("加载中...");
progressDialog.setCancelable(false); // 禁止点击外部取消
progressDialog.show();

2.2 设置样式与属性

方法 作用
setTitle() 设置对话框标题
setMessage() 设置提示文本
setProgressStyle() 设置进度条样式(STYLE_SPINNER/STYLE_HORIZONTAL)
setMax() 设置最大进度值(仅确定进度有效)

3. 进度条类型详解

3.1 不确定进度条

ProgressDialog dialog = new ProgressDialog(MainActivity.this);
dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); // 默认样式
dialog.setMessage("正在处理...");
dialog.show();

// 3秒后自动关闭
new Handler().postDelayed(() -> dialog.dismiss(), 3000);

3.2 确定进度条

ProgressDialog dialog = new ProgressDialog(MainActivity.this);
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
dialog.setMax(100);
dialog.setProgress(0);

// 模拟进度更新
new Thread(() -> {
    for (int i = 0; i <= 100; i++) {
        try {
            Thread.sleep(50);
            dialog.setProgress(i);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    dialog.dismiss();
}).start();

4. 自定义ProgressDialog

4.1 自定义布局

  1. 创建custom_progress.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android">
    <ProgressBar
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        style="@android:style/Widget.ProgressBar.Large"/>
    <TextView
        android:id="@+id/tv_custom"
        android:text="自定义文本"/>
</LinearLayout>
  1. 代码实现:
ProgressDialog dialog = new ProgressDialog(context);
View view = LayoutInflater.from(context).inflate(R.layout.custom_progress, null);
dialog.setView(view);
((TextView)view.findViewById(R.id.tv_custom)).setText("处理中...");

4.2 样式主题修改

styles.xml中定义:

<style name="MyProgressDialog" parent="Theme.AppCompat.Dialog">
    <item name="colorAccent">@color/red</item>
    <item name="android:textColorPrimary">#000000</item>
</style>

应用主题:

ProgressDialog dialog = new ProgressDialog(new ContextThemeWrapper(context, R.style.MyProgressDialog));

5. 线程与异步处理

5.1 Handler实现

Handler handler = new Handler(Looper.getMainLooper()) {
    @Override
    public void handleMessage(Message msg) {
        if (msg.what == 1) {
            progressDialog.setProgress(msg.arg1);
        }
    }
};

new Thread(() -> {
    for (int i = 0; i <= 100; i++) {
        Message msg = handler.obtainMessage(1);
        msg.arg1 = i;
        handler.sendMessage(msg);
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}).start();

5.2 AsyncTask实现

private class MyTask extends AsyncTask<Void, Integer, Void> {
    private ProgressDialog pd;

    @Override
    protected void onPreExecute() {
        pd = new ProgressDialog(MainActivity.this);
        pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        pd.show();
    }

    @Override
    protected Void doInBackground(Void... voids) {
        for (int i = 0; i <= 100; i++) {
            publishProgress(i);
            SystemClock.sleep(50);
        }
        return null;
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        pd.setProgress(values[0]);
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        pd.dismiss();
    }
}

6. 替代方案与最佳实践

6.1 ProgressBar替代方案

<!-- 布局文件中直接使用 -->
<ProgressBar
    android:id="@+id/progressBar"
    style="?android:attr/progressBarStyleHorizontal"
    android:layout_width="match_parent"/>

6.2 Material Design组件

使用MaterialAlertDialogBuilder(需Material组件库):

new MaterialAlertDialogBuilder(context)
    .setView(R.layout.progress_layout)
    .setTitle("处理中")
    .setCancelable(false)
    .show();

7. 常见问题与解决方案

问题 解决方案
内存泄漏 使用WeakReference包裹Context
主线程阻塞 确保进度更新在UI线程执行
样式不统一 应用AppCompat主题
废弃警告 使用AlertDialog+ProgressBar组合

8. 完整代码示例

查看GitHub仓库示例代码

// 完整Activity示例
public class MainActivity extends AppCompatActivity {
    private ProgressDialog progressDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button btnShow = findViewById(R.id.btn_show);
        btnShow.setOnClickListener(v -> showProgressDialog());
    }

    private void showProgressDialog() {
        progressDialog = new ProgressDialog(this);
        progressDialog.setTitle("文件下载");
        progressDialog.setMessage("请稍候...");
        progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        progressDialog.setIndeterminate(false);
        progressDialog.setMax(100);
        progressDialog.show();

        new Thread(this::mockDownload).start();
    }

    private void mockDownload() {
        for (int i = 0; i <= 100; i++) {
            try {
                Thread.sleep(100);
                runOnUiThread(() -> progressDialog.setProgress(i));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        progressDialog.dismiss();
    }
}

注意:实际开发中建议结合ViewModel和LiveData实现更优雅的架构设计。 “`

亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>

推荐阅读:
  1. Android基础View回顾
  2. 怎么在Android中利用ProgressDialog实现一个文件上传进度条效果

开发者交流群:

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

android progressdialog

上一篇:Android中怎么实现摇晃刷新

下一篇:Android中有哪些加载方式

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》
开发者交流群×