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