ProgressDialog代表了进度对话框,程序只要创建ProgressDialog实例,并将它显示出来就是一个进度对画框。使用ProgressDialog创建进度对话框有如下两种方式。
①如果只是创建简单的对话框,调用ProgressDialog提供的静态show()方法显示对话框即可。
②创建ProgressDialog,然后调用方法对对话框里的进度条进行设置,设置完成后将对话框显示出来即可。
为了对进度对话框里的进度进行设置,ProgressDialog包含了如下常用的方法。
- setIndeterminate(boolean indeterminate):设置对话框里的进度条不显示进度值。
- setMax(int max):设置对话框里的进度条的最大值。
- setMessage(CharSequence message):设置对话框里显示的消息。
- setProgress(int value):设置对话框里进度条的进度值。
- setProgressStyle(int style):设置对话框里进度条的风格。
下面程序的界面也很简单,界面上只有三个简单的按钮,当用户单击不同按钮时系统将会启动不同的进度对话框。其中第三个按钮激发的进度对话框比较复杂,该对话框使用填充数组来模拟耗时任务,随着任务的进行不断更新进度对话框上进度的显示。
<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:onClick="showIndeterminate" android:text="不显示的进度条"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="showpProgress" android:text="显示进度的进度条"/> </LinearLayout>
后台Activity代码文件如下:
package org.crazyit.helloworld; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.app.Activity; import android.app.ProgressDialog; import android.view.Menu; import android.view.View; public class ProgressDialogTest extends Activity { final static int MAX_PROGRESS=100; //改程序模拟填充长度为100的数组 private int[] data=new int[100]; //记录进度对话框的完成百分比 int progressStatus=0; int hasData=0; ProgressDialog pd1,pd2; //定义一个负责更新的进度的Handler Handler handler=new Handler() { public void handleMessage(Message msg) { //表明消息是由该程序发送的 if(msg.what==0x123) { pd2.setProgress(progressStatus); } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.progress_dialog_test); } 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 showpProgress(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; } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.progress_dialog_test, menu); return true; } }
上面程序为三个按钮定义了事件处理方法,其中一个按钮的事件处理方法调用了ProgressDialog的静态show()方法创建并显示对话框,如上面①号粗体字代码所示,这也是使用对话框的最简单的方式;第二个按钮的事件处理方法先创建了ProgressDialog对象,再调用该对话框的show()方法将它显示出来,如上面的②号粗体字代码所示;第三个按钮的事件处理方法也先创建ProgressDialog对象,并设置对话框的相关属性,再调用show()方法将它显示出来。
运行上面的程序出现如下所示界面效果: