當前位置:編程學習大全網 - 源碼下載 - android的Progressbar怎麽用

android的Progressbar怎麽用

Android提供的ProgressBar Widget控件與ProgressDialog應用目標不同,在程序壹開始即可在main.xml

Layout當中布局,先將部署在Layout裏的ProgressBar的屬性設為隱藏(壹開始看不見),而後使用進程來“假裝”程序忙碌中,但不同的是,可在進程當中取得運行時的進度,在“運行”的過程中,將運行進度通過TextView顯示出來。本範例除了學習ProgressBar

Widget的顯示及使用之外,另壹個學習關鍵則是Handler的使用,因為新起的進程無法訪問Activity裏的Widget,也無法將運行狀態外送出來,所以需要通過Handler及Message對象,將進程裏的狀態往外傳遞,最後由Activity的Handler事件接收取得運行的狀態。

壹、範例程序

src/irdc.ex04_17/EX04_17.java

為了讓Thread運行過程中,可以不斷地將信息往Activity傳遞,所以用了Android.os.Handler對象及Android.os.Message對象,且在類成員變量中聲明了兩個整數:GUI_STOP_NOTIFIER與GUI_THREADING_NOTIFIER,這兩個整數將作為信息傳遞出來時的信號標識,前者為當Thread需要喊停的時候處理,後者為進程正在運行過程中所需處理的標識。

程序中設計了壹個按鈕,此按鈕的工作是讓原本部署在main.xml裏的ProgressBar顯示出來(原來是設置為Android:visibility="gone"),而因為默認在main.xml中沒有指定它的indeterm-

inate屬性,所以即便在程序中強制調用了ProgressBar的setIndeterminate()方法,也無法改變ProgressBar.getProgress()的值,這個值將永遠為0。因此,筆者想要使用循環圖片動畫作為運行過程中的動畫,並用了壹個Counter(整數)來遞增,表示運行的百分比。

代碼如下:

/* import程序略 */

public class EX04_17 extends Activity

{

private TextView mTextView01;

private Button mButton01;

private ProgressBar mProgressBar01;

public int intCounter=0;

/* 自定義Handler信息代碼,用以作為標識事件處理 */

protected static final int GUI_STOP_NOTIFIER = 0x108;

protected static final int GUI_THREADING_NOTIFIER = 0x109;

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

mButton01 = (Button)findViewById(R.id.myButton1);?

mTextView01 = (TextView)findViewById(R.id.myTextView1);

/* 設置ProgressBar widget對象 */

mProgressBar01 = (ProgressBar)findViewById(R.id.myProgressBar1);

/* 調用setIndeterminate方法賦值indeterminate模式為false */

mProgressBar01.setIndeterminate(false);

/* 當單擊按鈕後,開始進程工作 */

mButton01.setOnClickListener(new Button.OnClickListener()

{

@Override

public void onClick(View v)

{

// TODO Auto-generated method stub

/* 單擊按鈕讓ProgressBar顯示 */

mTextView01.setText(R.string.str_progress_start);

/* 將隱藏的ProgressBar顯示出來 */

mProgressBar01.setVisibility(View.VISIBLE);

/* 指定Progress為最多100 */

mProgressBar01.setMax(100);

/* 初始Progress為0 */

mProgressBar01.setProgress(0);

/* 開始壹個進程 */

new Thread(new Runnable()

{

public void run()

{

/* 默認0至9,***運行10次的循環語句 */

for (int i=0;i<10;i++)

{

try

{

/* 成員變量,用以識別加載進度 */

intCounter = (i+1)*20;

/* 每運行壹次循環,即暫停1秒 */

Thread.sleep(1000);

/* 當Thread運行5秒後顯示運行結束 */

if(i==4)

{

/* 以Message對象,傳遞參數給Handler */

Message m = new Message();

/* 以what屬性指定User自定義 */

m.what = EX04_17.GUI_STOP_NOTIFIER;

EX04_17.this.myMessageHandler.sendMessage(m);

break;

}

else

{

Message m = new Message();

m.what = EX04_17.GUI_THREADING_NOTIFIER;

EX04_17.this.myMessageHandler.sendMessage(m);

}

}

catch(Exception e)

{

e.printStackTrace();

}

}

}

}).start();

}

});

}

/* Handler構建之後,會監聽傳來的信息代碼 */

Handler myMessageHandler = new Handler()

{

// @Override?

public void handleMessage(Message msg)

{?

switch (msg.what)

{?

/* 當取得標識為離開進程時所取得的信息 */

case EX04_17.GUI_STOP_NOTIFIER:

/* 顯示運行終了 */

mTextView01.setText(R.string.str_progress_done);

/* 設置ProgressBar Widget為隱藏 */

mProgressBar01.setVisibility(View.GONE);

Thread.currentThread().interrupt();

break;

/* 當取得標識為持續在進程當中時所取得的信息 */

case EX04_17.GUI_THREADING_NOTIFIER:

if(!Thread.currentThread().isInterrupted())

{

mProgressBar01.setProgress(intCounter);

/* 將顯示進度顯示於TextView當中 */

mTextView01.setText

(

getResources().getText(R.string.str_progress_start)+

"("+Integer.toString(intCounter)+"%)/n"+

"Progress:"+

Integer.toString(mProgressBar01.getProgress())+

"/n"+"Indeterminate:"+

Boolean.toString(mProgressBar01.isIndeterminate())

);

}

break;

}?

super.handleMessage(msg);?

}

};

}

二、擴展學習

範例程序中,調用mProgressBar01.setIndeterminate(false),不顯示背景進度Bar,若設置為mProgressBar01.setIndeterminate(true),也無法讓默認的ProgressBar圖片(轉圈圈)有正確的進度提示,理由是默認的ProgressBar不支持indeterminate

mode循環圖片方式,所以即便setIn-

determinate(true)也無法正確顯示進度。在本程序中,為刻意寫出作為對照練習,壹般在未知“進度”的情況下,可改用文字的方式顯示進度百分比,通過調用mProgressBar01.getProgress()取得運行進度值,顯示在文字中。請將Layout裏的ProgressBar

Widget定義中,加上壹個android:

indeterminateOnly屬性,指定其值為false,不顯示後臺進度Bar.

如下所示:

ProgressBar除了上述關於Android:progressBarStyle的屬性設置之外,筆者也調查了在線Android的源代碼(),壹些原本Android所使用的progressBarStyleHori-

zontal屬性,除默認“圓形”的圖片之外,還有其他的主題及方形圖片Drawable模式可以使用。

接下來看看,這段主題中的屬性名稱progressBarStyleHorizontal定義在frameworks/base/

core/res/res/values/ styles.xml裏,如下所示:

由此可見,如果想讓Android使用其他樣式的ProgressBar,可以在原本的Layout(main.xml)裏添加以下兩項屬性,以觀察運行過程中的圖片變化。

  • 上一篇:web前端需要學什麽
  • 下一篇:秦皇島青龍滿族自治縣2011年招聘農村中小學及幼兒教師簡章
  • copyright 2024編程學習大全網