[转载]史上最全系列之用户界面之progressbar-Android开发资料下载-eoe Android开发者社区_Android开发论坛.
前言
在Android程序中,经常有一些操作需要用户等待一段时间,才能完成用户指定的任务,例如,发送短信,下载网络上的文 件等。如果在等待过程中不给用户一个程序还在“活着”,还在执行操作的提示的话,用户可能会以为程序卡死而强制结束程序。ProgressBar,顾名思 义,就是一个进度条,它可以提醒用户操作还在执行,执行了多少。灵活运用ProgressBar,对提升用户体验有很大的帮助。
我这里会带领大家做一个简单的程序,这里用了多线程在后台执行操作,并实现了Progressbar最常用了两种用法,希望对刚刚接触Android开发的朋友有一些帮助。
ProgressBar简介
在Adnroid中,系统提供的ProgressBar主要有两种样式。
第一种Indeterminate模式,也是默认的一种:
就是一个小圈圈在那转圈。
第二种,就是传统意义上的进度条。
第一种一般做为一个不需要让用户知道操作完成度,或者无法知道操作完成度时,仅仅用作一个提示器来告诉用户操作仍在进行, 第二种则可以设置进度,让用户看到操作进行了多少,大概还需要等待多久。两种方式各有其用途,至于用哪一个就要看场景了。你也可以自定义 ProgressBar的样式。
你需要注意,Progressbar仅仅是一个指示器,操作是需要在后台进行的。你的Progressbar的进度要尽量 准确的反应后台操作的进度。当Progressbar进度显示为完成的话,你要确保你的的程序的后台操作已经完成。不然的话,容易给用户一些错误的心理预 期,当预期与事实不符合的时候,用户可能会有受到欺骗的感觉。
ProgressBar重要方法概述
setMax(int):设置Progressbar进度的最大值
setProgress(int):设置当前进度
getMax():返回这个进度条的范围的上限
getProgress():返回进度
getSecondaryProgress():返回次要进度
incrementProgressBy(int diff):指定增加的进度
isIndeterminate():指示进度条是否在不确定模式下
setIndeterminate(boolean indeterminate):设置不确定模式下
setVisibility(int v):设置该进度条是否可视
代码讲解
程序最终界面:
右上角那个刷新图标,目前还不是Progressbar,仅仅是一个图片,运行起来的话会替换成一个圆圈式的progressbar。开始按钮下方的长条就是一个进度式progressbar。
程序功能就是点击开始按钮,条式progressbar每秒前进10%,10秒完成,于此同时右上角progressbar也一直转动。
首先布局文件
<!--?xml version="1.0" encoding="utf-8"?--> /> <button> </button>
主程序代码:
package com.example.eoeprogressbar; import android.app.ActionBar; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.ProgressBar; import android.widget.TextView; public class EOEProgressbar extends Activity{ EditText edit_url; Button btn_open; TextView text_msg; ActionBar actionBar; ProgressBar progressBar; Menu mOptionsMenu=null; private View mRefreshIndeterminateProgressView = null; String Url; boolean refreshing=false; private Handler handler=new Handler(){ @Override public void handleMessage(Message msg){ int m=(Integer)msg.obj; progressBar.setProgress(m); if(m==10){ refreshing=!refreshing; setRefreshActionItemState(refreshing); } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_eoeprogressbar); FindView(); progressBar.setMax(10); progressBar.setProgress(0); btn_open.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub if(!refreshing){ new Thread(){ public void run(){ for(int i=0;i<10;i++){ postMsg(i+1); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } .start(); refreshing=!refreshing; setRefreshActionItemState(refreshing); } } }); } private void postMsg(Integer value){ Message message=Message.obtain(); message.obj=value; handler.sendMessage(message); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.eoeprogressbar, menu); mOptionsMenu=menu; return true; } private void FindView(){ actionBar=getActionBar(); btn_open=(Button)findViewById(R.id.open); text_msg=(TextView)findViewById(R.id.message); progressBar=(ProgressBar)findViewById(R.id.progress); } public void setRefreshActionItemState(boolean refreshing) { // On Honeycomb, we can set the state of the refresh button by giving it a custom // action view. if (mOptionsMenu == null) { return; } final MenuItem refreshItem = mOptionsMenu.findItem(R.id.action_refresh); if (refreshItem != null) { if (refreshing) { if (mRefreshIndeterminateProgressView == null) { LayoutInflater inflater = (LayoutInflater) EOEProgressbar.this.getSystemService( Context.LAYOUT_INFLATER_SERVICE); mRefreshIndeterminateProgressView = inflater.inflate( R.layout.actionbar_indeterminate_progress, null); } refreshItem.setActionView(mRefreshIndeterminateProgressView); } else { refreshItem.setActionView(null); } } } }
从程序运行逻辑开始一步一步讲解。
设置进度条最大进度为10,当前进度为0:
代码片段,双击复制
01
02
progressBar.setMax(10);
progressBar.setProgress(0);
开始按钮的点击事件:
btn_open.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub if(!refreshing){ new Thread(){ public void run(){ for(int i=0;i<10;i++){ postMsg(i+1); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } .start(); refreshing=!refreshing; setRefreshActionItemState(refreshing); } } });
refreshing自定义的boolen型变量,用来判断工作状态。操作必须用多线程操作,不然无法实时更新界面。
new Thread(){ public void run(){ for(int i=0;i<10;i++){ postMsg(i+1); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } .start();
这里就是另开一个线程,在这个线程里执行一个循环,执行十次,每次休眠1秒。
postMsg是像handler发送消息的方法,代码如下:
private void postMsg(Integer value){ Message message=Message.obtain(); message.obj=value; handler.sendMessage(message); }
功能就是像handler发送进度。
setRefreshActionItemState是将右上角刷新选项替换成一个圆圈式progressbar的方法。这个代码是我从google的simlple中找到的,写的很不错。大家可一多看看。
private Handler handler=new Handler(){ @Override public void handleMessage(Message msg){ int m=(Integer)msg.obj; progressBar.setProgress(m); if(m==10){ refreshing=false; setRefreshActionItemState(refreshing); } } };
这里是handler接受消息后处理的过程。通过progressBar.setProgress(m)来设置progressbar 的进度。当m=10时,则操作完成,移除上方圆圈式progressbar。
程序中用到了条式进度条显示操作完成状态,圆圈式进度条显示操作正在进行,基本progressbar的常用操作就是这两种了。
最后给大家点参考资料,有空可以去看看。
花样Android ProgressBar 史上最强大讲解 :http://www.eoeandroid.com/thread-1081-1-1.html
google官方文档:http://developer.Android.com/reference/Android/widget/ProgressBar.html
EOEProgressBar.zip (1.19 MB, 下载次数: 81)
附件里有两个多余的java文件,忘了删除,大家请无视。