原文网址;http://blog.csdn.net/jamesliulyc/article/details/6375598

首先在onCreateDialog方法里创建一个ProgressDialog,如下:

  1. //this表示该对话框是针对当前Activity的
  2. progressDialog = new ProgressDialog(this);
  3. //设置最大值为100
  4. progressDialog.setMax(100);
  5. //设置进度条风格STYLE_HORIZONTAL
  6. progressDialog.setProgressStyle(
  7. ProgressDialog.STYLE_HORIZONTAL);
  8. progressDialog.setTitle("进度条对话框");

接下来就是进度条的进度更新,因为对话框对象一直被当前Dialog保存着,所以onCreateDialog在下次调用对话框时不会在被调,所以

进度条更新操作不能在onCreateDialog里面,而是在onPrepareDialog里面进行。

首先要将进度条置为0

  1. progressDialog.incrementProgressBy(-progressDialog.getProgress());

increamentProgressBy源码中是调用了ProgressBar的setProgress(mProgress + diff); mProgress是当前进度值,这里的diff就是-progressDialog.getProgress(),最后结果为0,所以也可以这么用,效果和调用incrementProgressBy一样的,如下:

  1. progressDialog.onStart();
  2. progressDialog.setProgress(0);

值得一提的是,不能直接只用setProgress(0)来设置,这样的话,第一次弹出对话框效果可以和上面的一样,但是之后再弹出对话框的进度一直都是100。为什么这里不能直接用setProgress(0),查看源码可以知道,

  1. if (mHasStarted) {
  2. mProgress.setProgress(value);
  3. onProgressChanged();
  4. } else {
  5. mProgressVal = value;
  6. }

mHasStarted第一次调用的时候是true,当进度条达到100%时会调用onStop方法(此方法为protected,无法直接调用),将mHasStarted设置为false,也就是无法setProgress(value)了,只能通过onStart来将mHasStarted设置为true。

当点击“显示进度条对话框”按钮,这时候需要很耗时然后才显示对话框,而往往都会导致假死,如果超过5秒未响应将强制关闭,所以这里需要添加个多线程来做进一步处理。而进度条的增加效果是很快的,所以这这里需要让大家看到效果,得停几毫秒后再继续。

为了使主线程不受影响(处理当前Activity的线程),在点击按钮且耗时操作完后需要发送消息给主线程,主线程再做相应处理。线程之间的消息传递和异步处理是通过Handler来做处理的,相关代码如下:

  1. new Thread() {
  2. public void run() {
  3. for(int i=0; i<=100; i++) {
  4. handler.sendEmptyMessage(INCREASE);
  5. if(progressDialog.getProgress() >= 100) {
  6. break;
  7. }
  8. try {
  9. Thread.sleep(50);
  10. } catch (InterruptedException e) {
  11. e.printStackTrace();
  12. }
  13. }
  14. }
  15. }.start();

Handler的处理如下:(Handler具体说明网上很多,可以参考此处 http://my.unix-center.net/~Simon_fu/?p=652

  1. handler = new Handler() {
  2. @Override
  3. public void handleMessage(Message msg) {
  4. switch(msg.what) {
  5. case INCREASE:
  6. progressDialog.incrementProgressBy(1);
  7. if(progressDialog.getProgress() >= 100) {
  8. //  progressDialog.dismiss();
  9. }
  10. break;
  11. }
  12. super.handleMessage(msg);
  13. }
  14. };

解释就到这里,先看个效果图:

实现步骤:

第一步,一个按钮用来点击后弹出对话框的

res/layout/progress_dialog_layout.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout
  3. xmlns:android="http://schemas.android.com/apk/res/android"
  4. android:layout_width="fill_parent"
  5. android:layout_height="wrap_content">
  6. <Button android:id="@+id/button"
  7. android:text="显示进度条对话框"
  8. android:layout_width="fill_parent"
  9. android:layout_height="wrap_content"/>
  10. </LinearLayout>

第二步,

src/com/dialog/activity/ProgressDialogActivity.java

  1. package com.dialog.activity;
  2. import android.app.Activity;
  3. import android.app.Dialog;
  4. import android.app.ProgressDialog;
  5. import android.os.Bundle;
  6. import android.os.Handler;
  7. import android.os.Message;
  8. import android.view.View;
  9. import android.widget.Button;
  10. public class ProgressDialogActivity extends Activity {
  11. private final int PROGRESS_DIALOG = 1;
  12. private final int INCREASE = 0;
  13. private ProgressDialog progressDialog = null;
  14. private Handler handler = null;
  15. @Override
  16. public void onCreate(Bundle savedInstanceState) {
  17. super.onCreate(savedInstanceState);
  18. setContentView(R.layout.progress_dialog_layout);
  19. Button button = (Button) findViewById(R.id.button);
  20. View.OnClickListener listener =
  21. new View.OnClickListener() {
  22. @Override
  23. public void onClick(View view) {
  24. showDialog(PROGRESS_DIALOG);
  25. }
  26. };
  27. button.setOnClickListener(listener);
  28. handler = new Handler() {
  29. @Override
  30. public void handleMessage(Message msg) {
  31. switch(msg.what) {
  32. case INCREASE:
  33. progressDialog.incrementProgressBy(1);
  34. if(progressDialog.getProgress() >= 100) {
  35. //  progressDialog.dismiss();
  36. }
  37. break;
  38. }
  39. super.handleMessage(msg);
  40. }
  41. };
  42. }
  43. @Override
  44. public Dialog onCreateDialog(int id) {
  45. switch(id) {
  46. case PROGRESS_DIALOG:
  47. //this表示该对话框是针对当前Activity的
  48. progressDialog = new ProgressDialog(this);
  49. //设置最大值为100
  50. progressDialog.setMax(100);
  51. //设置进度条风格STYLE_HORIZONTAL
  52. progressDialog.setProgressStyle(
  53. ProgressDialog.STYLE_HORIZONTAL);
  54. progressDialog.setTitle("进度条对话框");
  55. break;
  56. }
  57. return progressDialog;
  58. }
  59. @Override
  60. public void onPrepareDialog(int id, Dialog dialog) {
  61. switch(id) {
  62. case PROGRESS_DIALOG:
  63. //将进度条清0
  64. progressDialog.incrementProgressBy(-progressDialog.getProgress());
  65. new Thread() {
  66. public void run() {
  67. for(int i=0; i<=100; i++) {
  68. handler.sendEmptyMessage(INCREASE);
  69. if(progressDialog.getProgress() >= 100) {
  70. break;
  71. }
  72. try {
  73. Thread.sleep(50);
  74. } catch (InterruptedException e) {
  75. e.printStackTrace();
  76. }
  77. }
  78. }
  79. }.start();
  80. break;
  81. }
  82. }
  83. }

源码下载地址:http://download.csdn.net/source/3244868

【转】24. android dialog ——ProgressDialog 进度条对话框详解的更多相关文章

  1. 【转】【Android】ProgressDialog进度条对话框的使用

    Android ProgressDialog进度条对话框的使用: 转自:http://aina-hk55hk.iteye.com/blog/679134/ <?xml version=" ...

  2. android学习笔记20——ProgressDialog进度条对话框

    ProgressDialog==>进度条对话框 ProgressDialog本身就代表一个进度条对话框,程序只需要创建ProgressDialog实例,并将其显示出来就是一个进度条对话框:开发者 ...

  3. Android——ProgressDialog 进度条对话框

    public class ProgressDialogActivity extends Activity {    private Button btn_large_pd, btn_horizonta ...

  4. ProgressDialog进度条对话框

    (一) 1.效果图: 2.activity_main.xml <?xml version="1.0" encoding="utf-8"?> < ...

  5. Android多种进度条使用详解

    在这里,总结一下loading进度条的使用简单总结一下. 一.说起进度条,必须说说条形进度条,经常都会使用到嘛,特别是下载文件进度等等,还有像腾讯QQ安装进度条一样,有个进度总给人良好的用户体验. 先 ...

  6. PHP实现的进度条效果详解

      <?php //防止执行超时 set_time_limit(0); //清空并关闭输出缓存 ob_end_clean(); //需要循环的数据 for($i = 0; $i < 188 ...

  7. (转载)Android自定义ProgressDialog进度等待框

    Android自定义ProgressDialog进度等待框 作者:无缘公子 字体:[增加 减小] 类型:转载 时间:2016-01-11我要评论 这篇文章主要介绍了Android自定义Progress ...

  8. Android 进度条对话框ProgressDialog

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...

  9. 10.Android之ProgressDialog进度对话框学习

    APP应用中经常会下载某些东西,这里面有涉及到进度对话框,今天来学习下. 首先,布局里放进两个按钮,点击一个显示条形进度条,另一个显示圆形进度条.代码如下: <?xml version=&quo ...

随机推荐

  1. ssh端口映射,本地转发

    应用场景: # HOSTA<-X->HOSTB 表示A,B两机器相互不可以访问,  HOSTA<-->HOSTB 表示A,B两机器可以相互访问# 1.localhost< ...

  2. Java发送邮件的简单实现

    使用Oracle官方的JavaMail进行实现,JavaMail下载地址:https://java.net/projects/javamail/pages/Home 将下载好的jar包加入到工程路径中 ...

  3. hdu 1685 Booksort (IDA*)

    Booksort Time Limit: 10000/10000 MS (Java/Others)    Memory Limit: 102400/102400 K (Java/Others) Tot ...

  4. JavaScript高级编程II

         原文地址: http://www.onlamp.com/pub/a/onlamp/2007/08/23/advanced-javascript-ii.html?page=1 在前面的文章中, ...

  5. Java基础知识强化之集合框架笔记01:集合的由来与数组的区别

    1. 集合的由来: 我们学习的是面向对象语言,而面向对象语言对事物的描述是通过对象体现的,为了方便对多个对象进行操作,我们就必须把这多个对象进行存储.而要想存储多个对象,就不能是一个基本的变量,而应该 ...

  6. Java利用Rxtx进行串口通讯

    最近在做传感器数据采集的工作,底层是基于Zigbee的无线传感网络,所有数据采集到Zigbee协调器上然后通知上位机数据采集完成,上位机通过USB转串口去读取数据就可以了.那么问题来了,如何进行串口通 ...

  7. 配置VSFTP服务器

    一.Linux FTP服务器分类:  <1>wu-ftp  <2>proftp=profession ftp  <3>vsftp=very security ftp ...

  8. 打jar包的方法

    打jar包的方法是什么? java打jar包,引用其他.jar文件 java项目打jar包 将java源码打成jar包 maven打jar例子 打war包的方法是什么? Eclipse->项目右 ...

  9. 在java代码中显示json字符串(怎么避免json字符串中双引号在java代码中显示)

    String log = "eyJvcmRlckluZm8iOnsiaWQiOjEwNzQwNCwib3JkZXJJZCI6MjczNjQyMSwicHJvZHVjdENvZGUiOjQ1N ...

  10. 《CSS网站布局实录》学习笔记(一)

    今天开始,认真学习前端技术,哈哈哈~~~加油~~~ 推荐这本<CSS网站布局实录>(第2版)给初级入门选手,虽然这本书年代有点久远,不过很经典. 注明一下:这里讲述的CSS均为CSS 2. ...