您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 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();
方法 | 作用 |
---|---|
setTitle() |
设置对话框标题 |
setMessage() |
设置提示文本 |
setProgressStyle() |
设置进度条样式(STYLE_SPINNER/STYLE_HORIZONTAL) |
setMax() |
设置最大进度值(仅确定进度有效) |
ProgressDialog dialog = new ProgressDialog(MainActivity.this);
dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); // 默认样式
dialog.setMessage("正在处理...");
dialog.show();
// 3秒后自动关闭
new Handler().postDelayed(() -> dialog.dismiss(), 3000);
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();
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>
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("处理中...");
在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));
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();
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();
}
}
<!-- 布局文件中直接使用 -->
<ProgressBar
android:id="@+id/progressBar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"/>
使用MaterialAlertDialogBuilder
(需Material组件库):
new MaterialAlertDialogBuilder(context)
.setView(R.layout.progress_layout)
.setTitle("处理中")
.setCancelable(false)
.show();
问题 | 解决方案 |
---|---|
内存泄漏 | 使用WeakReference 包裹Context |
主线程阻塞 | 确保进度更新在UI线程执行 |
样式不统一 | 应用AppCompat主题 |
废弃警告 | 使用AlertDialog +ProgressBar 组合 |
// 完整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元/月。点击查看>>
开发者交流群:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。