[转载]史上最全系列之用户界面之progressbar-Android开发资料下载-eoe Android开发者社区_Android开发论坛

[转载]史上最全系列之用户界面之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"?-->

/&gt;
<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&lt;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&lt;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&lt;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文件,忘了删除,大家请无视。

赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏