万书网 > 文学作品 > Android从入门到精通 > 第38页

第38页





图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;  //改变完成进度