图4.1 应用自动完成文本框实现搜索框
4.1.2 进度条
当一个应用在后台执行时,前台界面不会有任何信息,这时用户根本不知道程序是否在执行以及执行进度等,因此需要使用进度条来提示程序执行的进度。在Android中,进度条(ProgressBar)用于向用户显示某个耗时操作完成的百分比。
在屏幕中添加进度条,可以在XML布局文件中通过
< ProgressBar
属性列表
>
ProgressBar组件支持的XML属性如表4.2所示。
表4.2 ProgressBar支持的XML属性
XML属性 描 述
android:max 用于设置进度条的最大值
android:progress 用于指定进度条已完成的进度值
android:progressDrawable 用于设置进度条轨道的绘制形式
除了表4.2中介绍的属性外,进度条组件还提供了下面两个常用方法用于操作进度。
[√]setProgress(int progress)方法:用于设置进度完成的百分比。
[√]incrementProgressBy(int diff)方法:用于设置进度条的进度增加或减少。当参数值为正数时,表示进度增加;为负数时,表示进度减少。
下面给出一个关于在屏幕中使用进度条的实例。
例4.2 在Eclipse中创建Android项目,名称为4.2,实现水平进度条和圆形进度条。(实例位置:光盘\TM\sl\4\4.2)
(1)修改新建项目的res\layout目录下的布局文件main.xml,将默认添加的TextView组件删除,并添加一个水平进度条和一个圆形进度条,修改后的代码如下:
android:id="@+id/progressBar1"
android:layout_width="match_parent"
android:max="100"
style="@android:style/Widget.ProgressBar.Horizontal"
android:layout_height="wrap_content"/>
android:id="@+id/progressBar2"
style="?android:attr/progressBarStyleLarge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
说明: 在上面的代码中,通过android:max属性设置水平进度条的最大进度值;通过style属性可以为ProgressBar指定风格,常用的style属性值如表4.3所示。
表4.3 ProgressBar的style属性的可选值
XML属性 描 述
?android:attr/progressBarStyleHorizontal 细水平长条进度条
?android:attr/progressBarStyleLarge 大圆形进度条
?android:attr/progressBarStyleSmall 小圆形进度条
@android:style/Widget.ProgressBar.Large 大跳跃、旋转画面的进度条
@android:style/Widget.ProgressBar.Small 小跳跃、旋转画面的进度条
@android:style/Widget.ProgressBar.Horizontal 粗水平长条进度条
(2)在主活动MainActivity中,定义两个ProgressBar类的对象(分别用于表示水平进度条和圆形进度条,一个int型的变量(用于表示完成进度)和一个处理消息的Handler类的对象,具体代码如下:
private ProgressBar horizonP; //水平进度条
private ProgressBar circleP; //圆形进度条
private int mProgressStatus = 0; //完成进度
private Handler mHandler; //声明一个用于处理消息的Handler类的对象
(3)在主活动的onCreate()方法中,首先获取水平进度条和圆形进度条,然后通过匿名内部类实例化处理消息的Handler类的对象,并重写其handleMessage()方法,实现当耗时操作没有完成时更新进度,否则设置进度条不显示,关键代码如下:
horizonP = (ProgressBar) findViewById(R.id.progressBar1); //获取水平进度条
circleP=(ProgressBar)findViewById(R.id.progressBar2); //获取圆形进度条
mHandler=new Handler(){
@Override
public void handleMessage(Message msg) {
if(msg.what==0x111){
horizonP.setProgress(mProgressStatus); //更新进度
}else{
Toast.makeText(MainActivity.this, "耗时操作已经完成", Toast.LENGTH_SHORT).show();
horizonP.setVisibility(View.GONE); //设置进度条不显示,并且不占用空间
circleP.setVisibility(View.GONE); //设置进度条不显示,并且不占用空间
}
}
};
(4)开启一个线程,用于模拟一个耗时操作。在该线程中,调用sendMessage()方法发送处理消息,具体代码如下:
new Thread(new Runnable() {
public void run() {
while (true) {
mProgressStatus = doWork(); //获取耗时操作完成的百分比
Message m=new Message();
if(mProgressStatus<100){
m.what=0x111;
mHandler.sendMessage(m); //发送信息
}else{
m.what=0x110;
mHandler.sendMessage(m); //发送消息
break;
}
}
}
//模拟一个耗时操作
private int doWork() {
mProgressStatus+=Math.random()*10; //改变完成进度