Android开发系列(二十七):使用ProgressDialog创建进度对话框

进度对话框在平常的应用中很常见,比如下载的时候,打开页面的时候、转移文件等等。有环形的、有长条形的。基本就这两种

创建进度对话框的两种方式:

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线程,来模拟一个耗时的操作

这是效果图:

时间: 2024-08-05 08:48:03

Android开发系列(二十七):使用ProgressDialog创建进度对话框的相关文章

Android开发系列(九):创建数据库以及完成简单的CRUD操作

本篇博文主要实现简单的创建数据库以及实现CRUD操作. 首先,我们建立一个Android Project,命名为db 一.完成数据库的创建操作: 用SQLiteOpenHelper类中的getWritableDatabase()和getReadableDatabase()都可以获取一个操作数据库的SQLiteDatabase实例,其中getReadableDatabase()方法中会调用getWritableDatabase()方法. 区别:其中,getWritableDatabase() 方法

Android开发系列(十七):读取assets目录下的数据库文件

在做Android应用的时候,不可避免要用到数据库.但是当我们把应用的apk部署到真机上的时候,已经创建好的数据库及其里边的数据是不能随着apk一起安装到真机上的. (PS:这篇博客解决了我前面博客中写的一个小游戏的一个问题,另外也可以读取Raw目录下的数据库文件) 这就造成了一个问题,这个问题其实很好解决,解决方法如下: 我们首先把有数据的数据库文件放在assets资源目录下边,然后在apk应用启动的时候,把assets目录下的数据库文件的数据写入到真机的内存中去. 下边开始我们的代码编写:

Android开发系列(十七):读取assets文件夹下的数据库文件

在做Android应用的时候,不可避免要用到数据库.可是当我们把应用的apk部署到真机上的时候,已经创建好的数据库及其里边的数据是不能随着apk一起安装到真机上的. (PS:这篇博客攻克了我前面博客中写的一个小游戏的一个问题.另外也能够读取Raw文件夹下的数据库文件) 这就造成了一个问题.这个问题事实上非常好解决,解决方法例如以下: 我们首先把有数据的数据库文件放在assets资源文件夹下边,然后在apk应用启动的时候,把assets文件夹下的数据库文件的数据写入到真机的内存中去. 下边開始我们

Android开发(二十七)——android:layout_weight的真实含义

android:layout_weight的真实含义是:一旦View设置了该属性(假设有效的情况下),那么该 View的宽度等于原有宽度(android:layout_width)加上剩余空间的占比! 含义:原有宽度+剩余空间占比 设屏幕宽度为L,在两个view的宽度都为match_parent的情况下,原有宽度为L,两个的View的宽度都为L,那么剩余宽度为L-(L+L) = -L, 左边的View占比三分之一,所以总宽度是L+(-L)*1/3 = (2/3)L.事实上默认的View的weig

2.5.6 使用progressDialog创建进度对话框

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_gravity="center" android:orientation="vertical&q

快速Android开发系列网络篇之Android-Async-Http

快速Android开发系列网络篇之Android-Async-Http 转:http://www.cnblogs.com/angeldevil/p/3729808.html 先来看一下最基本的用法 AsyncHttpClient client = new AsyncHttpClient(); client.get("http://www.google.com", new AsyncHttpResponseHandler() { @Override public void onSucce

C#程序员学习Android开发系列之搭建开发环境

接触Android好久了,记得09年刚在中国大陆有点苗头的时候,我就知道了google有个Android,它是智能机操作系统.后来在Android出1.5版本之后,我第一时间下载了eclipse开发工具.adt以及android sdk,体验了一把android开发,记得当时搭建开发环境相当麻烦.由于android开发是基于Java的,所以除了上述的工具之外,首先需要安装jdk,记得当时流行的是jdk1.5(后来是1.6,现在是1.7,未来是1.8),安装好之后需要设置环境变量. 时隔4年之后,

C#程序员学习Android开发系列之ListView

上篇博客解决了Android客户端通过WebService与服务器端程序进行交互的问题,这篇博客重点关注两个问题,一个是Android应用程序如何与本机文件型数据库SQLite进行交互,另一问题则是如何在ListView中按照我们想要的界面效果进行展示.限于篇幅这篇重点讲ListView,下篇博客重点阐述SQLite. ListView是一个常用的数据显示控件,假设我们要做一个简单的界面,如图所示. 这张图是我直接从Android平板电脑(Android 4.2.2)上面截图下来的,就是一个普通

C#程序员学习Android开发系列之学习路线图

通过前面的3篇博客已经简单的介绍了Android开发的过程并写了一个简单的demo,了解了Android开发的环境以及一些背景知识. 接下来这篇博客不打算继续学习Android开发的细节,先停一下,明确一下接下来的学习目标以及学习路线. 一.对Android开发的基本认识 1.Android原生开发是基于Java语言的,由于我比较擅长C#,所以对Java语言本身不太熟练,需要加强Java语言基础的练习,这一块我会穿插到具体的知识点练习当中,并且在必要的地方给出与C#语言的对比(其实基本上在语法层