• 【转】24. android dialog ——ProgressDialog 进度条对话框详解


    原文网址;http://blog.csdn.net/jamesliulyc/article/details/6375598

    首先在onCreateDialog方法里创建一个ProgressDialog,如下:

    [java] view plaincopy
     
    1. //this表示该对话框是针对当前Activity的  
    2. progressDialog = new ProgressDialog(this);  
    3. //设置最大值为100  
    4. progressDialog.setMax(100);  
    5. //设置进度条风格STYLE_HORIZONTAL  
    6. progressDialog.setProgressStyle(  
    7.         ProgressDialog.STYLE_HORIZONTAL);  
    8. progressDialog.setTitle("进度条对话框");  

    接下来就是进度条的进度更新,因为对话框对象一直被当前Dialog保存着,所以onCreateDialog在下次调用对话框时不会在被调,所以

    进度条更新操作不能在onCreateDialog里面,而是在onPrepareDialog里面进行。

    首先要将进度条置为0

    [java] view plaincopy
     
    1. progressDialog.incrementProgressBy(-progressDialog.getProgress());  

    increamentProgressBy源码中是调用了ProgressBar的setProgress(mProgress + diff); mProgress是当前进度值,这里的diff就是-progressDialog.getProgress(),最后结果为0,所以也可以这么用,效果和调用incrementProgressBy一样的,如下:

    [java] view plaincopy
     
    1. progressDialog.onStart();  
    2. progressDialog.setProgress(0);  

    值得一提的是,不能直接只用setProgress(0)来设置,这样的话,第一次弹出对话框效果可以和上面的一样,但是之后再弹出对话框的进度一直都是100。为什么这里不能直接用setProgress(0),查看源码可以知道,

    [c-sharp] view plaincopy
     
    1. if (mHasStarted) {  
    2.       mProgress.setProgress(value);  
    3.       onProgressChanged();  
    4. else {  
    5.       mProgressVal = value;  
    6. }  

    mHasStarted第一次调用的时候是true,当进度条达到100%时会调用onStop方法(此方法为protected,无法直接调用),将mHasStarted设置为false,也就是无法setProgress(value)了,只能通过onStart来将mHasStarted设置为true。

    当点击“显示进度条对话框”按钮,这时候需要很耗时然后才显示对话框,而往往都会导致假死,如果超过5秒未响应将强制关闭,所以这里需要添加个多线程来做进一步处理。而进度条的增加效果是很快的,所以这这里需要让大家看到效果,得停几毫秒后再继续。

    为了使主线程不受影响(处理当前Activity的线程),在点击按钮且耗时操作完后需要发送消息给主线程,主线程再做相应处理。线程之间的消息传递和异步处理是通过Handler来做处理的,相关代码如下:

    [java] view plaincopy
     
    1. new Thread() {  
    2.     public void run() {  
    3.         for(int i=0; i<=100; i++) {  
    4.             handler.sendEmptyMessage(INCREASE);  
    5.             if(progressDialog.getProgress() >= 100) {  
    6.                 break;  
    7.             }  
    8.             try {  
    9.                 Thread.sleep(50);  
    10.             } catch (InterruptedException e) {  
    11.                 e.printStackTrace();  
    12.             }  
    13.         }  
    14.     }  
    15. }.start();  

    Handler的处理如下:(Handler具体说明网上很多,可以参考此处 http://my.unix-center.net/~Simon_fu/?p=652

    [java] view plaincopy
     
    1. handler = new Handler() {  
    2.     @Override  
    3.     public void handleMessage(Message msg) {  
    4.         switch(msg.what) {  
    5.             case INCREASE:  
    6.                 progressDialog.incrementProgressBy(1);  
    7.                 if(progressDialog.getProgress() >= 100) {  
    8.                 //  progressDialog.dismiss();  
    9.                 }  
    10.                 break;  
    11.         }  
    12.         super.handleMessage(msg);  
    13.     }  
    14. };  

    解释就到这里,先看个效果图:

    实现步骤:

    第一步,一个按钮用来点击后弹出对话框的

    res/layout/progress_dialog_layout.xml

    [xhtml] view plaincopy
     
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <LinearLayout  
    3.   xmlns:android="http://schemas.android.com/apk/res/android"  
    4.   android:layout_width="fill_parent"  
    5.   android:layout_height="wrap_content">  
    6.   <Button android:id="@+id/button"  
    7.     android:text="显示进度条对话框"  
    8.     android:layout_width="fill_parent"  
    9.     android:layout_height="wrap_content"/>  
    10. </LinearLayout>  

    第二步,

    src/com/dialog/activity/ProgressDialogActivity.java

    [java] view plaincopy
     
    1. package com.dialog.activity;  
    2.   
    3. import android.app.Activity;  
    4. import android.app.Dialog;  
    5. import android.app.ProgressDialog;  
    6. import android.os.Bundle;  
    7. import android.os.Handler;  
    8. import android.os.Message;  
    9. import android.view.View;  
    10. import android.widget.Button;  
    11.   
    12. public class ProgressDialogActivity extends Activity {  
    13.       
    14.     private final int PROGRESS_DIALOG = 1;  
    15.       
    16.     private final int INCREASE = 0;  
    17.       
    18.     private ProgressDialog progressDialog = null;  
    19.       
    20.     private Handler handler = null;  
    21.       
    22.     @Override  
    23.     public void onCreate(Bundle savedInstanceState) {  
    24.         super.onCreate(savedInstanceState);  
    25.         setContentView(R.layout.progress_dialog_layout);  
    26.           
    27.         Button button = (Button) findViewById(R.id.button);  
    28.         View.OnClickListener listener =   
    29.             new View.OnClickListener() {  
    30.                   
    31.                 @Override  
    32.                 public void onClick(View view) {  
    33.                     showDialog(PROGRESS_DIALOG);  
    34.                 }  
    35.             };  
    36.         button.setOnClickListener(listener);  
    37.           
    38.         handler = new Handler() {  
    39.             @Override  
    40.             public void handleMessage(Message msg) {  
    41.                 switch(msg.what) {  
    42.                     case INCREASE:  
    43.                         progressDialog.incrementProgressBy(1);  
    44.                         if(progressDialog.getProgress() >= 100) {  
    45.                         //  progressDialog.dismiss();  
    46.                         }  
    47.                         break;  
    48.                 }  
    49.                 super.handleMessage(msg);  
    50.             }  
    51.         };  
    52.     }  
    53.       
    54.     @Override  
    55.     public Dialog onCreateDialog(int id) {  
    56.         switch(id) {  
    57.             case PROGRESS_DIALOG:     
    58.                 //this表示该对话框是针对当前Activity的  
    59.                 progressDialog = new ProgressDialog(this);  
    60.                 //设置最大值为100  
    61.                 progressDialog.setMax(100);  
    62.                 //设置进度条风格STYLE_HORIZONTAL  
    63.                 progressDialog.setProgressStyle(  
    64.                         ProgressDialog.STYLE_HORIZONTAL);  
    65.                 progressDialog.setTitle("进度条对话框");  
    66.                 break;  
    67.         }  
    68.         return progressDialog;  
    69.     }  
    70.       
    71.     @Override  
    72.     public void onPrepareDialog(int id, Dialog dialog) {  
    73.           
    74.         switch(id) {  
    75.             case PROGRESS_DIALOG:  
    76.                 //将进度条清0  
    77.                 progressDialog.incrementProgressBy(-progressDialog.getProgress());  
    78.                 new Thread() {  
    79.                     public void run() {  
    80.                         for(int i=0; i<=100; i++) {  
    81.                             handler.sendEmptyMessage(INCREASE);  
    82.                             if(progressDialog.getProgress() >= 100) {  
    83.                                 break;  
    84.                             }  
    85.                             try {  
    86.                                 Thread.sleep(50);  
    87.                             } catch (InterruptedException e) {  
    88.                                 e.printStackTrace();  
    89.                             }  
    90.                         }  
    91.                     }  
    92.                 }.start();  
    93.                 break;  
    94.         }  
    95.     }  
    96. }  

     源码下载地址:http://download.csdn.net/source/3244868

  • 相关阅读:
    miniconda安装和使用
    linux下git push出现“更新被拒绝,因为远程仓库包含您本地尚不存在的提交。”问题的处理
    win8、win10系统添加组策略的方法
    Unable to guess the mime type as no guessers are available (Did you enable the php_fileinfo extension?)
    thinkphp5 连接SQLserver
    thinkphp5 上传图片压缩
    在Vue中使用了Swiper ,从后台获取动态数据后,swiper滑动失效
    微信小程序多图上传及后台处理(后台用thinkphp3.2)
    PHP 数组下标从0开始
    微信小程序去除左上角返回的按钮
  • 原文地址:https://www.cnblogs.com/wi100sh/p/4495863.html
Copyright © 2020-2023  润新知