一、进度对话框ProgressDialog
1、概述
ProgressDialog本身就代表了进度对话框,只要创建其实例并显示,就可在程序中得到一个进度对话框。
ProgressDialog包含的常用方法如下:
setIndeterminate (boolean indeterminate):设置对话框的进度条不显示进度值;
setMax (int max):设置对话框里进度条的最大值;
setMessage (CharSequence message):设置对话框里显示的消息;
setProgress (int value):设置对话框里进度条的进度值;
setProgressStyle (int style):设置对话框里进度条的风格。
一般有两种风格,如图所示:
2、开发实例:
下面的程序是一个简单的模拟界面,单机按钮时系统启动进度对话框,用于显示一个耗时任务的完成进度。
完整代码:布局文件中只定义了一个Button,在此略掉。
package com.xsjayz.pross;
import android.app.Activity;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
/**
* 进度对话框:该程序模拟填充长度为100的数组的过程
*
* @version 2012-09-11
*/
public class ProgressDialogActivity extends Activity {
private int[] data = new int[100];
int hasData = 0;
// 定义进度对话框的完成百分比
int progressStatus = 0;
// 定义进度对话框标识
final int PROGRESS_DIALOG = 0x112;
ProgressDialog progressDialog;
// 定义一个负责更新进度的Handler
Handler handler;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button button = (Button) findViewById(R.id.btn);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Activity的方法,用于显示指定标识的对话框
showDialog(PROGRESS_DIALOG);
}
});
handler = new Handler() {
@Override
public void handleMessage(Message msg) {
// 表明消息是由该程序发送的
if (msg.what == 0x111) {
// 设置对话框的进度值
progressDialog.setProgress(progressStatus);
}
}
};
}
/**
* 创建对话框
*/
@Override
protected Dialog onCreateDialog(int id, Bundle status) {
switch (id) {
case PROGRESS_DIALOG:
// 创建进度对话框对象
progressDialog = new ProgressDialog(this);
progressDialog.setMax(100);
progressDialog.setTitle("任务完成百分比");
progressDialog.setMessage("耗时任务完成百分比...");
// 设置该对话框不能使用“取消”按钮关闭
progressDialog.setCancelable(false);
// 设置进度对话框的风格:圆形风格、水平风格
// progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
// 设置对话框的进度条是否显示进度,true不显示,false显示
progressDialog.setIndeterminate(false);
break;
default:
break;
}
// 该方法调用后返回一个对话框对象
return progressDialog;
}
/**
* 该方法将在onCreateDialog()方法调用之后被回调
*/
@Override
protected void onPrepareDialog(int id, Dialog dialog) {
super.onPrepareDialog(id, dialog);
switch (id) {
case PROGRESS_DIALOG:
// 对话框进度清零,如果不清零,多次点击弹出对话框,进度条会保持在上一次的进度值
progressDialog.incrementProgressBy(-progressDialog.getProgress());
new Thread() {
@Override
public void run() {
// super.run();
while (progressStatus < 100) {
// 获取耗时操作doWork()返回值,作为完成的进度的百分比值
progressStatus = doWork();
// 发送消息到Handler
Message message = new Message();
message.what = 0x111;
// 发送消息
handler.sendMessage(message);
}
// 如果耗时任务已经完成,设置数值为0,并关闭对话框
if (progressStatus >= 100) {
hasData = 0;
progressStatus = 0;
progressDialog.dismiss();
}
}
}.start();
break;
default:
break;
}
}
/**
* 一个模拟耗时操作的方法
*
* @return hasData
*/
public int doWork() {
// 为数组元素赋值
data[hasData++] = (int) (Math.random() * 100);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
return hasData;
}
}
package com.xsjayz.pross;
import android.app.Activity;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
/**
* 进度对话框:该程序模拟填充长度为100的数组的过程
*
* @version 2012-09-11
*/
public class ProgressDialogActivity extends Activity {
private int[] data = new int[100];
int hasData = 0;
// 定义进度对话框的完成百分比
int progressStatus = 0;
// 定义进度对话框标识
final int PROGRESS_DIALOG = 0x112;
ProgressDialog progressDialog;
// 定义一个负责更新进度的Handler
Handler handler;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button button = (Button) findViewById(R.id.btn);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Activity的方法,用于显示指定标识的对话框
showDialog(PROGRESS_DIALOG);
}
});
handler = new Handler() {
@Override
public void handleMessage(Message msg) {
// 表明消息是由该程序发送的
if (msg.what == 0x111) {
// 设置对话框的进度值
progressDialog.setProgress(progressStatus);
}
}
};
}
/**
* 创建对话框
*/
@Override
protected Dialog onCreateDialog(int id, Bundle status) {
switch (id) {
case PROGRESS_DIALOG:
// 创建进度对话框对象
progressDialog = new ProgressDialog(this);
progressDialog.setMax(100);
progressDialog.setTitle("任务完成百分比");
progressDialog.setMessage("耗时任务完成百分比...");
// 设置该对话框不能使用“取消”按钮关闭
progressDialog.setCancelable(false);
// 设置进度对话框的风格:圆形风格、水平风格
// progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
// 设置对话框的进度条是否显示进度,true不显示,false显示
progressDialog.setIndeterminate(false);
break;
default:
break;
}
// 该方法调用后返回一个对话框对象
return progressDialog;
}
/**
* 该方法将在onCreateDialog()方法调用之后被回调
*/
@Override
protected void onPrepareDialog(int id, Dialog dialog) {
super.onPrepareDialog(id, dialog);
switch (id) {
case PROGRESS_DIALOG:
// 对话框进度清零,如果不清零,多次点击弹出对话框,进度条会保持在上一次的进度值
progressDialog.incrementProgressBy(-progressDialog.getProgress());
new Thread() {
@Override
public void run() {
// super.run();
while (progressStatus < 100) {
// 获取耗时操作doWork()返回值,作为完成的进度的百分比值
progressStatus = doWork();
// 发送消息到Handler
Message message = new Message();
message.what = 0x111;
// 发送消息
handler.sendMessage(message);
}
// 如果耗时任务已经完成,设置数值为0,并关闭对话框
if (progressStatus >= 100) {
hasData = 0;
progressStatus = 0;
progressDialog.dismiss();
}
}
}.start();
break;
default:
break;
}
}
/**
* 一个模拟耗时操作的方法
*
* @return hasData
*/
public int doWork() {
// 为数组元素赋值
data[hasData++] = (int) (Math.random() * 100);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
return hasData;
}
}