`

android最简单的ProgressBar以及ProgressDialog使用

 
阅读更多
说到ProgressDialog和ProgressBar,相信大家不陌生吧,就是比如导入联系人的时候会出现一个进度条的控件,或者下载的时候的进度条。
首先说一下ProgressBar:
既然要更新UI,在android中,一般是不在主线程也就是Activity所在的那个线程来做些费时的操作的,因为这样会阻塞主线程,导致出现ANR错误。因此,一般是新开一个线程来做费时的操作,当然,做操作的时候又要通知前端的主线程来更新界面,这样能让用户知道在做操作啊,因此,就需要使用android中的线程通信Handler了。好了。下面是示例:
1,写好一个带progressbar的xml布局文件:
    <?xml version="1.0" encoding="utf-8"?>    
     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    
         android:orientation="vertical"   
         android:layout_width="fill_parent"    
         android:layout_height="fill_parent">    
           
         <TextView   
             android:layout_width="fill_parent"    
             android:layout_height="wrap_content"   
             />    
         <ProgressBar   
             android:id="@+id/rectangleProgressBar"    
             style="?android:attr/progressBarStyleHorizontal" mce_style="?android:attr/progressBarStyleHorizontal"     
             android:layout_width="fill_parent"   
             android:layout_height="wrap_content"  
             android:visibility="gone"  
             />  
         <ProgressBar   
             android:id="@+id/circleProgressBar"    
             style="?android:attr/progressBarStyleLarge" mce_style="?android:attr/progressBarStyleLarge"  
             android:layout_width="wrap_content"   
             android:layout_height="wrap_content"  
             android:visibility="gone"   
             />  
            
         <Button android:id="@+id/button"   
                 android:text="Show ProgressBar"    
                 android:layout_width="wrap_content"   
                 android:layout_height="wrap_content"  
                 />  
     </LinearLayout>   


2,Activity代码:
public class ProgressBarDemo extends Activity {  
      
    private ProgressBar rectangleProgressBar,circleProgressBar;  
    private Button mButton;  
      
    protected static final int STOP = 0x10000;  
    protected static final int NEXT = 0x10001;  
    private int iCount = 0;  
      
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  
        //findView By id  
        rectangleProgressBar = (ProgressBar)findViewById(R.id.rectangleProgressBar);  
        circleProgressBar = (ProgressBar)findViewById(R.id.circleProgressBar);  
        mButton = (Button)findViewById(R.id.button);  
          
        rectangleProgressBar.setIndeterminate(false);  
        circleProgressBar.setIndeterminate(false);  
          
        mButton.setOnClickListener(new Button.OnClickListener() {  
              
            public void onClick(View v) {  
                  
                rectangleProgressBar.setVisibility(View.VISIBLE);  
                circleProgressBar.setVisibility(View.VISIBLE);  
                  
                rectangleProgressBar.setMax(100);  
                rectangleProgressBar.setProgress(0);  
                circleProgressBar.setProgress(0);  
                  
                //创建一个线程,每秒步长为5增加,到100%时停止  
                Thread mThread = new Thread(new Runnable() {  
                      
                    public void run() {  
                          
                        for(int i=0 ; i < 20; i++){  
                            try{  
                                iCount = (i + 1) * 5;  
                                Thread.sleep(1000);  
                                if(i == 19){  
                                    Message msg = new Message();  
                                    msg.what = STOP;  
                                    mHandler.sendMessage(msg);  
                                    break;  
                                }else{  
                                    Message msg = new Message();  
                                    msg.what = NEXT;  
                                    mHandler.sendMessage(msg);  
                                }  
                            }catch (Exception e) {  
                                e.printStackTrace();  
                            }  
                        }  
                          
                    }  
                });  
                mThread.start();  
            }  
        });  
    }  
      
    //定义一个Handler  
    private Handler mHandler = new Handler(){  
        public void handleMessage(Message msg){  
            switch (msg.what) {  
            case STOP:  
                rectangleProgressBar.setVisibility(View.GONE);  
                circleProgressBar.setVisibility(View.GONE);  
                Thread.currentThread().interrupt();  
                break;  
            case NEXT:  
                if(!Thread.currentThread().isInterrupted()){  
                    rectangleProgressBar.setProgress(iCount);  
                    circleProgressBar.setProgress(iCount);  
                }  
                break;  
            }  
        }  
    };  
}  


当然,这里涉及两种progressbar,一种是进度条的,一种是环形的,另外这里的线程停止方式,还可以有另外的方式,就是设置一个boolean变量来控制线程的停止。

再说一下ProgressDialog的用法;示例代码:
1,也是先看布局:
    <?xml version="1.0" encoding="utf-8"?>  
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
        android:orientation="vertical"  
        android:layout_width="fill_parent"  
        android:layout_height="fill_parent"  
        >  
    <TextView android:id="@+id/status"  
        android:layout_width="fill_parent"   
        android:layout_height="wrap_content"   
        android:text="@string/hello"  
        />  
    <Button android:id="@+id/beginBtn"  
        android:layout_width="fill_parent"  
        android:layout_height="wrap_content"  
        android:text="begin"  
        />  
    </LinearLayout>  

2,再看Activity代码:
public class ProgressBarDemo extends Activity {  
      
    private TextView statusTextView;  
    private Button beginBtn;  
    private ProgressDialog progressDialog;  
      
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  
        statusTextView = (TextView)findViewById(R.id.status);  
        beginBtn = (Button)findViewById(R.id.beginBtn);  
        setListener();  
    }  
      
    /** 
     * 用Handler来更新UI 
     */  
    private Handler handler = new Handler(){  
  
        @Override  
        public void handleMessage(Message msg) {  
              
            //关闭ProgressDialog  
            progressDialog.dismiss();  
              
            //更新UI  
            statusTextView.setText("Completed!");  
        }};  
      
          
    /** 
     * 点击按钮事件listener 
     */  
    private void setListener(){  
        beginBtn.setOnClickListener(new View.OnClickListener() {  
              
            @Override  
            public void onClick(View v) {  
                  
                //显示ProgressDialog  
                progressDialog = ProgressDialog.show(ProgressBarDemo.this, "Loading...", "Please wait...", true, false);  
                  
                //新建线程  
                new Thread(){  
  
                    @Override  
                    public void run() {  
                        //需要花时间计算的方法  
                        Calculation.calculate(4);  
                          
                        //向handler发消息  
                        handler.sendEmptyMessage(0);  
                    }}.start();  
            }  
        });  
    }

class Calculation {  
      
    public static void calculate(int sleepSeconds){  
        try {  
            Thread.sleep(sleepSeconds * 1000);  
        } catch (Exception e) {  
            // TODO: handle exception  
        }  
    }  
  
}    
      
}  

很简单吧,主要使用的android中线程之间的通信机制Handler。
分享到:
评论

相关推荐

    Android ProgressBar进度条和ProgressDialog进度框的展示DEMO

    在Android 3.0(API level 11)之后,官方推荐使用其他方式,例如使用ProgressBar嵌入在布局中来代替ProgressDialog。但为了兼容性,我们可以继续使用ProgressDialog,尤其是在较低版本的Android系统中。 创建一个...

    android 对话框中的进度条 (ProgressDialog)

    最后,值得注意的是,由于Android设计指南推荐使用更现代的组件(如ProgressBar和Snackbar)来替换ProgressDialog,因此在新的项目中,开发者可能会选择使用这些替代方案。然而,在某些特定场景下,ProgressDialog...

    Android中ProgressDialog的简单示例

    在这个简单的示例中,我们将深入探讨如何在Android应用中使用ProgressDialog,并通过一个名为"ProgressBarDemo"的项目来演示其基本用法。 首先,我们需要在布局文件中定义ProgressDialog。在XML布局文件中,虽然...

    自定义ProgressDialog(仿京东)

    在Android开发中,ProgressDialog是一个非常常见的组件,通常用于在后台执行任务时向用户展示一个进度指示器,以告知用户应用程序正在处理数据。然而,系统默认的ProgressDialog样式可能无法满足所有设计需求,这时...

    旋转和帧动画实现自定义的ProgressDialog

    在Android开发中,ProgressDialog是一种常见的UI元素,用于在应用程序执行长时间操作时向用户显示进度,如数据加载或保存。为了提供更好的用户体验,开发者有时会希望自定义ProgressDialog,使其与应用的风格保持...

    Android简单的登陆注册

    同时,使用ProgressDialog或ProgressBar显示网络请求进度,让用户知道应用程序仍在运行。 最后,为了提高安全性,应用应遵循安全最佳实践,如使用HTTPS防止中间人攻击,使用哈希和盐值对密码进行加密存储,避免明文...

    Android四大布局及三个控件

    本篇文章将详细讲解Android的四大布局:线性布局(LinearLayout)、相对布局(RelativeLayout)、帧布局(FrameLayout)以及网格布局(GridLayout),以及如何使用AlertDialog、ProgressBar和ProgressDialog这三个...

    Android应用源码之ProgressDialogSample.zip

    在现代Android开发中,考虑到ProgressDialog的阻塞特性,推荐使用`ProgressBar`配合`AsyncTask`或者`LiveData`来实现非阻塞的进度提示。这种方式允许用户与应用程序的其他部分交互,提供更好的用户体验。 `...

    几种常用Android Progress效果

    使用`android.widget.ProgressBar`并设置`style`为`@android:style/Widget.ProgressBar.Horizontal`即可。开发者可以通过`setProgress()`方法更新进度值,`setMax()`设定最大值。此外,还可以使用`indeterminate`...

    Android progress前台运算.zip

    然而,随着Android设计指南的更新,`ProgressDialog`逐渐被非模态的`ProgressBar`所取代。`ProgressBar`可以无缝集成到布局中,不影响用户与应用的其他部分交互。例如,一个水平的进度条可以这样添加到布局XML中: ...

    Android Studio 常用对话框

    通过ProgressDialog或ProgressBar,我们可以创建一个可视化的进度指示器,使用户了解操作的进度并保持耐心。 总之,掌握Android Studio中各种对话框的使用技巧是提升Android应用用户体验的关键。从简单到复杂,从...

    android下载带有进度条

    其次,为了显示下载进度,我们需要使用ProgressBar或者ProgressDialog。ProgressBar是线性或圆形的进度条,而ProgressDialog则是一个弹出式对话框,通常包含一个圆形进度条。在下载过程中,我们可以监听网络请求的...

    Android demo

    更高级的特效包括动画(如淡入淡出)、自定义字体、动态文本更新以及使用Spannable对象来实现文本的一部分有不同的样式或交互。 在这个`Android demo`中,很可能是通过自定义`ProgressDialog`的行为来展示如何在...

    Android 对话框、进度条、定时器

    在Android中,我们可以使用`AlertDialog`、`ProgressDialog`或自定义布局来创建对话框。创建对话框时,需要定义对话框的内容、按钮以及它们的点击事件处理。 例如,如果你有一个点击图片触发对话框的需求,可以这样...

    android弹出窗口,

    首先,`Toast`是Android中最简单的弹出窗口形式,它用于显示简短的信息,然后在一段时间后自动消失。创建Toast非常简单,只需要调用`Toast.makeText()`方法,传入上下文、消息文本和持续时间(短时间或长时间)。...

    安卓进度条实现

    然而,由于ProgressDialog在Android P(API 28)及更高版本中已被弃用,我们推荐使用AlertDialog配合ProgressBar来实现类似功能: ```java // 创建一个Builder AlertDialog.Builder builder = new AlertDialog....

    Android远程登录含有loading登录效

    在Android中,我们可以使用`ProgressDialog`或自定义的`View`来展示加载效果。例如,`ProgressBar`是一个简单的进度条,而`CircleProgressView`则提供更美观的环形加载动画。加载效果的启动和关闭可以通过`...

    ProgressDialogApplication.rar

    这就是在Android Studio中创建一个简单的使用ProgressDialog的应用的基本步骤。在实际项目中,你可能需要根据具体需求调整ProgressDialog的样式、文本信息,以及后台任务的实现方式。这个例子展示了如何在用户等待...

    Android所有的对话框

    随着Android版本的更新,ProgressDialog已被弃用,推荐使用`ProgressBar`结合`AlertDialog`自定义实现。 3. **DatePickerDialog 和 TimePickerDialog** 这两种对话框分别用于选择日期和时间。它们提供了用户友好的...

    Android 自定义Dialog,文字动态加载效果

    Dialog是Android系统提供的一种用于与用户交互的组件,它通常在主界面之上弹出,显示一些提示信息或进行一些简单的操作。AlertDialog是Dialog的一种子类,提供了更为丰富的样式和配置选项,包括标题、消息、按钮等。...

Global site tag (gtag.js) - Google Analytics