Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 807|回复: 0

android dialog ——ProgressDialog 进度条对话框详解-  Andr

[复制链接]

该用户从未签到

发表于 2011-10-24 15:05:51 | 显示全部楼层 |阅读模式
首先在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;

            }

    }

}
复制代码
ProgressDialogDemo.rar (42.91 KB, 下载次数: 12)
回复

使用道具 举报

该用户从未签到

发表于 2011-10-24 15:06:01 | 显示全部楼层

Re:android

回帖从我做起
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2011-10-24 15:06:18 | 显示全部楼层

Re:android

支持楼主
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2025-1-11 14:09 , Processed in 0.377033 second(s), 45 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表