一、进度对话框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;
	}

}