温馨提示×

温馨提示×

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

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

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

发布时间:2021-06-28 15:53:39 来源:亿速云 阅读:278 作者:Leah 栏目:移动开发
# 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实现更优雅的架构设计。 “`

向AI问一下细节

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

AI