进度对话框在平常的应用中很常见,比如下载的时候,打开页面的时候、转移文件等等。有环形的、有长条形的。基本就这两种
创建进度对话框的两种方式:
1、创建ProgressDialog实例,然后调用ProgressDialog提供的静态show()方法显示实例即可
2、创建ProgressDialog实例,然后调用方法对进度条进行设置,然后显示出来。
长条形的进度条还分为两种,第一种是显示进度,第二种是不显示进度。
在接下来的例子中,我们会看到三种:环形进度条、显示进度的长条形进度条、不显示进度的长条形进度条
首先,我们创建一个Android项目,然后编写main.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="环形进度条"
android:onClick="showSpinner" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="不显示进度的进度条"
android:onClick="showIndeterminate" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="显示进度的进度条"
android:onClick="showProgress" />
</LinearLayout>
这里定义了三个按钮,三个按钮对应了相应的onClick属性
接下来,是ProgressDialogTest.java:
package org.crazyit.ui;
import android.app.Activity;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
public class ProgressDialogTest extends Activity
{
final static int MAX_PROGRESS = 100;
// 该程序模拟填充长度为100的数组
private int[] data = new int[50];
// 记录进度对话框的完成百分比
int progressStatus = 0;
int hasData = 0;
ProgressDialog pd1,pd2;
// 定义一个负责更新的进度的Handler
Handler handler = new Handler()
{
@Override
public void handleMessage(Message msg)
{
// 表明消息是由该程序发送的。
if (msg.what == 0x123)
{
pd2.setProgress(progressStatus);
}
}
};
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
public void showSpinner(View source)
{
// 调用静态方法显示环形进度条
ProgressDialog.show(this, "任务执行中"
, "任务执行中,请等待", false, true); //①
}
public void showIndeterminate(View source)
{
pd1 = new ProgressDialog(ProgressDialogTest.this);
// 设置对话框的标题
pd1.setTitle("任务正在执行中");
// 设置对话框显示的内容
pd1.setMessage("任务正在执行中,敬请等待...");
// 设置对话框能用“取消”按钮关闭
pd1.setCancelable(true);
// 设置对话框的进度条风格
pd1.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
// 设置对话框的进度条是否显示进度
pd1.setIndeterminate(true);
pd1.show(); //②
}
public void showProgress(View source)
{
// 将进度条的完成进度重设为0
progressStatus = 0;
// 重新开始填充数组。
hasData = 0;
pd2 = new ProgressDialog(ProgressDialogTest.this);
pd2.setMax(MAX_PROGRESS);
// 设置对话框的标题
pd2.setTitle("任务完成百分比");
// 设置对话框 显示的内容
pd2.setMessage("耗时任务的完成百分比");
// 设置对话框不能用“取消”按钮关闭
pd2.setCancelable(false);
// 设置对话框的进度条风格
pd2.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
// 设置对话框的进度条是否显示进度
pd2.setIndeterminate(false);
pd2.show(); //③
new Thread()
{
public void run()
{
while (progressStatus < MAX_PROGRESS)
{
// 获取耗时操作的完成百分比
progressStatus = MAX_PROGRESS
* doWork() / data.length;
// 发送空消息到Handler
handler.sendEmptyMessage(0x123);
}
// 如果任务已经完成
if (progressStatus >= MAX_PROGRESS)
{
// 关闭对话框
pd2.dismiss();
}
}
}.start();
}
// 模拟一个耗时的操作。
public int doWork()
{
// 为数组元素赋值
data[hasData++] = (int) (Math.random() * 100);
try
{
Thread.sleep(100);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
return hasData;
}
}
在进行第三个:显示进度的进度条的时候,我们用到了Thread线程,来模拟一个耗时的操作
这是效果图: