android dialog ——ProgressDialog 进度条对话框详解
16lz
2021-01-24
首先在onCreateDialog方法里创建一个ProgressDialog,如下:
接下来就是进度条的进度更新,因为对话框对象一直被当前Dialog保存着,所以onCreateDialog在下次调用对话框时不会在被调,所以 进度条更新操作不能在onCreateDialog里面,而是在onPrepareDialog里面进行。 首先要将进度条置为0
increamentProgressBy源码中是调用了ProgressBar的setProgress(mProgress + diff); mProgress是当前进度值,这里的diff就是-progressDialog.getProgress(),最后结果为0,所以也可以这么用,效果和调用incrementProgressBy一样的,如下:
值得一提的是,不能直接只用setProgress(0)来设置,这样的话,第一次弹出对话框效果可以和上面的一样,但是之后再弹出对话框的进度一直都是100。为什么这里不能直接用setProgress(0),查看源码可以知道,
Handler的处理如下:(Handler具体说明网上很多,可以参考此处http://my.unix-center.net/~Simon_fu/?p=652 )
解释就到这里,先看个效果图: 实现步骤: 第一步,一个按钮用来点击后弹出对话框的 res/layout/progress_dialog_layout.xml
第二步, src/com/dialog/activity/ProgressDialogActivity.java
- //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;
- }
- 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;
- }
- }
- }
更多相关文章
- android 设置activity启动退出动画 | 解决设置activity 动画不生
- 【Android(安卓)开发教程】从Intent返回结果
- Android(安卓)2D图像显示
- Android(安卓)OpenGL ES 开发教程(7):创建实例应用OpenGLDemos程
- android实现程序的后台运行 and 完全退出
- 24. android dialog ——ProgressDialog 进度条对话框详解
- Android的startActivity启动出错
- 全球各大运营商代码。方便国外卡的朋友修改运营商显示
- Android(安卓)8.0 Volte开关流程 HD图标显示