Android的Widget,有许多是用于User交互设计的,但也有一些是用于程序提示的,比如其中的ProgressBar,其与ProgressDialog对话框的应用目的相似,但后者是继承自Android.app.ProgressDialog所设计的交互对话窗口。在应用ProgressDialog的时候要新建它的对象,在运行时会弹出“对话框”作为提醒,此时应用程序后台会失焦,直到进程结束,才会将主控权交给应用程序,如果在Activity当中不希望后台失焦,又希望User有某后台程序正处于忙碌阶段,此时,就要用到ProgressBar了。
ProgressBar可以在res/layout/main.xml中布局,但是ProgressDialog不能。
(此程序是在Android SDK2.3.3环境下开发的)例子如下:
public class A05Activity extends Activity {
private TextView tv;
/*按钮的作用是让部署在main.xml里的ProgressBar显示出来(原来是设置为*Android:visibility="gone"),因为默认在main.xml中没有指定它的indeterminate属性,所*以即使在程序中强制使用了ProgressBar的setIndeterminate()方法,也无法的、改变*ProgressBar.getProgress()的值,这个值将永远为0。因此使用循环图片动画作为运行
*过程中的动画,并用了一个intCounter来递增,表示运行的百分比。*/
private Button b;
//声明两个整数作为信息传递出来时的讯号标识,前者为Thread需要喊停时的处理,后
//者为进程正在运行过程中所需处理的标识。
protected static final int GUI_STOP_NOTIFIER=0x108;
protected static final int GUI_THREADING_NOTIFIER=0x109;
private ProgressBar pb;
private int intCounter=0;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tv=(TextView)findViewById(R.id.tv);
b=(Button)findViewById(R.id.button);
b.setBackgroundColor(Color.YELLOW);
pb=(ProgressBar)findViewById(R.id.pb);
pb.setIndeterminate(false);//开始把ProgressBar设为隐藏
pb.setBackgroundColor(Color.GREEN);
b.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
tv.setText(R.string.str_progress_start);
pb.setVisibility(View.VISIBLE);//当单击按钮后将ProgressBar设为可见
pb.setMax(100);//设置ProgressBar的最大值
pb.setProgress(0);//设置ProgressBar的初始值
new Thread(new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
for(int i=0;i<10;i++){
try {
intCounter=(i+1)*20;
Thread.sleep(1000);
if(i==4){
Message m=new Message();
m.what=A05Activity.GUI_STOP_NOTIFIER;
A05Activity.this.myMessageHandler.sendMessage(m);
break;
}
else{
Message m=new Message();
m.what=A05Activity.GUI_THREADING_NOTIFIER;
A05Activity.this.myMessageHandler.sendMessage(m);
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}).start();
}
});
}
//新起的进程无法访问Activity里的Widget,也无法将运行状态外送出来,因此使
//用Handler和Message对象,将进程里的状态往外传递,最后由Activity的Activity
//的Handler事件接收取得运行的状态。
Handler myMessageHandler=new Handler(){
public void handleMessage(Message m){
switch(m.what){
case A05Activity.GUI_STOP_NOTIFIER:
tv.setText(R.string.str_progress_done);
pb.setVisibility(View.GONE);
Thread.currentThread().interrupt();
break;
case A05Activity.GUI_THREADING_NOTIFIER:
if(!Thread.currentThread().isInterrupted()){
tv.setText(getResources().getText(R.string.str_progress_start)+"("+Integer.toString(intCounter)+"%)\n"+"Progress:"+Integer.toString(pb.getProgress())+"\n"+"Indeterminate"+Boolean.toString(pb.isIndeterminate()));
}
break;
}
super.handleMessage(m);
}
};
}