【转】24. android dialog ——ProgressDialog 进度条对话框详解
原文网址;http://blog.csdn.net/jamesliulyc/article/details/6375598
首先在onCreateDialog方法里创建一个ProgressDialog,如下:
- //this表示该对话框是针对当前Activity的
- progressDialog = new ProgressDialog(this);
- //设置最大值为100
- progressDialog.setMax(100);
- //设置进度条风格STYLE_HORIZONTAL
- progressDialog.setProgressStyle(
- ProgressDialog.STYLE_HORIZONTAL);
- progressDialog.setTitle("进度条对话框");
接下来就是进度条的进度更新,因为对话框对象一直被当前Dialog保存着,所以onCreateDialog在下次调用对话框时不会在被调,所以
进度条更新操作不能在onCreateDialog里面,而是在onPrepareDialog里面进行。
首先要将进度条置为0
- progressDialog.incrementProgressBy(-progressDialog.getProgress());
increamentProgressBy源码中是调用了ProgressBar的setProgress(mProgress + diff); mProgress是当前进度值,这里的diff就是-progressDialog.getProgress(),最后结果为0,所以也可以这么用,效果和调用incrementProgressBy一样的,如下:
- progressDialog.onStart();
- progressDialog.setProgress(0);
值得一提的是,不能直接只用setProgress(0)来设置,这样的话,第一次弹出对话框效果可以和上面的一样,但是之后再弹出对话框的进度一直都是100。为什么这里不能直接用setProgress(0),查看源码可以知道,
- if (mHasStarted) {
- mProgress.setProgress(value);
- onProgressChanged();
- } else {
- mProgressVal = value;
- }
mHasStarted第一次调用的时候是true,当进度条达到100%时会调用onStop方法(此方法为protected,无法直接调用),将mHasStarted设置为false,也就是无法setProgress(value)了,只能通过onStart来将mHasStarted设置为true。
当点击“显示进度条对话框”按钮,这时候需要很耗时然后才显示对话框,而往往都会导致假死,如果超过5秒未响应将强制关闭,所以这里需要添加个多线程来做进一步处理。而进度条的增加效果是很快的,所以这这里需要让大家看到效果,得停几毫秒后再继续。
为了使主线程不受影响(处理当前Activity的线程),在点击按钮且耗时操作完后需要发送消息给主线程,主线程再做相应处理。线程之间的消息传递和异步处理是通过Handler来做处理的,相关代码如下:
- new Thread() {
- public void run() {
- for(int i=0; i<=100; i++) {
- handler.sendEmptyMessage(INCREASE);
- if(progressDialog.getProgress() >= 100) {
- break;
- }
- try {
- Thread.sleep(50);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- }.start();
Handler的处理如下:(Handler具体说明网上很多,可以参考此处 http://my.unix-center.net/~Simon_fu/?p=652)
- handler = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- switch(msg.what) {
- case INCREASE:
- progressDialog.incrementProgressBy(1);
- if(progressDialog.getProgress() >= 100) {
- // progressDialog.dismiss();
- }
- break;
- }
- super.handleMessage(msg);
- }
- };
解释就到这里,先看个效果图:

实现步骤:
第一步,一个按钮用来点击后弹出对话框的
res/layout/progress_dialog_layout.xml
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content">
- <Button android:id="@+id/button"
- android:text="显示进度条对话框"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"/>
- </LinearLayout>
第二步,
src/com/dialog/activity/ProgressDialogActivity.java
- package com.dialog.activity;
- 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;
- public class ProgressDialogActivity extends Activity {
- private final int PROGRESS_DIALOG = 1;
- private final int INCREASE = 0;
- private ProgressDialog progressDialog = null;
- private Handler handler = null;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.progress_dialog_layout);
- Button button = (Button) findViewById(R.id.button);
- View.OnClickListener listener =
- new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- showDialog(PROGRESS_DIALOG);
- }
- };
- button.setOnClickListener(listener);
- handler = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- switch(msg.what) {
- case INCREASE:
- progressDialog.incrementProgressBy(1);
- if(progressDialog.getProgress() >= 100) {
- // progressDialog.dismiss();
- }
- break;
- }
- super.handleMessage(msg);
- }
- };
- }
- @Override
- public Dialog onCreateDialog(int id) {
- switch(id) {
- case PROGRESS_DIALOG:
- //this表示该对话框是针对当前Activity的
- progressDialog = new ProgressDialog(this);
- //设置最大值为100
- progressDialog.setMax(100);
- //设置进度条风格STYLE_HORIZONTAL
- progressDialog.setProgressStyle(
- ProgressDialog.STYLE_HORIZONTAL);
- progressDialog.setTitle("进度条对话框");
- break;
- }
- return progressDialog;
- }
- @Override
- public void onPrepareDialog(int id, Dialog dialog) {
- switch(id) {
- case PROGRESS_DIALOG:
- //将进度条清0
- progressDialog.incrementProgressBy(-progressDialog.getProgress());
- new Thread() {
- public void run() {
- for(int i=0; i<=100; i++) {
- handler.sendEmptyMessage(INCREASE);
- if(progressDialog.getProgress() >= 100) {
- break;
- }
- try {
- Thread.sleep(50);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- }.start();
- break;
- }
- }
- }
源码下载地址:http://download.csdn.net/source/3244868
【转】24. android dialog ——ProgressDialog 进度条对话框详解的更多相关文章
- 【转】【Android】ProgressDialog进度条对话框的使用
Android ProgressDialog进度条对话框的使用: 转自:http://aina-hk55hk.iteye.com/blog/679134/ <?xml version=" ...
- android学习笔记20——ProgressDialog进度条对话框
ProgressDialog==>进度条对话框 ProgressDialog本身就代表一个进度条对话框,程序只需要创建ProgressDialog实例,并将其显示出来就是一个进度条对话框:开发者 ...
- Android——ProgressDialog 进度条对话框
public class ProgressDialogActivity extends Activity { private Button btn_large_pd, btn_horizonta ...
- ProgressDialog进度条对话框
(一) 1.效果图: 2.activity_main.xml <?xml version="1.0" encoding="utf-8"?> < ...
- Android多种进度条使用详解
在这里,总结一下loading进度条的使用简单总结一下. 一.说起进度条,必须说说条形进度条,经常都会使用到嘛,特别是下载文件进度等等,还有像腾讯QQ安装进度条一样,有个进度总给人良好的用户体验. 先 ...
- PHP实现的进度条效果详解
<?php //防止执行超时 set_time_limit(0); //清空并关闭输出缓存 ob_end_clean(); //需要循环的数据 for($i = 0; $i < 188 ...
- (转载)Android自定义ProgressDialog进度等待框
Android自定义ProgressDialog进度等待框 作者:无缘公子 字体:[增加 减小] 类型:转载 时间:2016-01-11我要评论 这篇文章主要介绍了Android自定义Progress ...
- Android 进度条对话框ProgressDialog
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...
- 10.Android之ProgressDialog进度对话框学习
APP应用中经常会下载某些东西,这里面有涉及到进度对话框,今天来学习下. 首先,布局里放进两个按钮,点击一个显示条形进度条,另一个显示圆形进度条.代码如下: <?xml version=&quo ...
随机推荐
- [置顶] COcos2d-X 中文API
本文来自http://blog.csdn.net/runaying ,引用必须注明出处! COcos2d-X 中文API 温馨提醒:使用二维码扫描软件,就可以在手机上访问我的博客啦!另外大家可以访问另 ...
- 最小生成树--->NYOJ-38 布线问题
此题是最基础的最小生成树的题目,有两种方法, 一个是prim一个是kruskal算法,前者利用邻接矩阵,后者是利用边集数组 prim算法的思想是:一个点一个点的找, 先找从第一个点到其他点最小的, 把 ...
- c#将Excel数据导入到数据库的实现代码(转载)
假如Excel中的数据如下: 数据库建表如下: 其中Id为自增字段: 代码如下: using System; using System.Collections.Generic ...
- C#获取当前系统磁盘符、系统目录、桌面等
1.获取方式如下 Environment.SpecialFolder中定义了许多常用的目录 //获取当前系统磁盘符方法1,返回:C: string path = Environment.GetEnvi ...
- 类名.this与类名.class
1..当在内部类中使用this指的就是内部类的对象, 为了访问外层类对象,就可以使用外层类名.this来访问. 2.在java中,每个class都有一个相应的Class对象,当编写好一个类,编译完成后 ...
- div中的内容居中
要使div中的内容居中显示,不仅div要设定“text-align:centr" ,内置对象要添加margin:auto;属性才能使其在firefox等其他浏览器中也能居中.
- 安装VS2010后,如何设置老版本的项目文件不是默认用VS2010打开
1.系统先后安装了VS2008和VS2010,在打开用VS2008创建的项目文件时总是会默认用VS2010打开,选择打开方式都不行,很不方便,差点要把VS2010卸载了. 其实只需要简单设置V ...
- 无法连接vCenter Server清单https://IP:10443
VMware vCenter Server服务器安装系统的时候使用一个IP,安装完VMware vCenter后来更换了另外一个IP,当使用vSphere Web Client登陆VMware vCe ...
- Windows下查看端口被程序占用的方法
有时安装程序时,会出现XX端口被占用的情况,可以通过CMD命令查看什么程序占用 1. netstat -ano 查看相应端口对应程序的PID 例如: C:\>netstat -ano A ...
- Leetcode 371: Sum of Two Integers(使用位运算实现)
题目是:Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -. ...