Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android編程入門 >> Android學習筆記:進度條ProgressBar的使用以及與AsyncTask的配合使用

Android學習筆記:進度條ProgressBar的使用以及與AsyncTask的配合使用

編輯:Android編程入門

ProgressBar時android用於顯示進度的組件。當執行一個比較耗時的操作(如io操作、網絡操作等),為了避免界面沒有變化讓用戶體驗降低,提供一個進度條可以讓用戶知道程序還在運行。

一、ProgressBar有如下幾種常見樣式

1、默認進度條的樣式為圓圈(為中等大小的圓圈)

<ProgressBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>

注意,當樣式為圓圈時,其進度不停的在旋轉,只是告訴用互程序在執行,無法精確地告訴用戶具體進度。

而且默認顯示就是旋轉的,還無法讓它停下來,只有通過程序讓其隱藏(比如任務處理完成時)。 

如果想要顯示為圓形的,又要控制其停頓和旋轉,需要用自定義的方式,這個不在這裡介紹。

隱藏進度條,很簡單:xxxx.setVisibility(View.GONE);

2、顯示為大的尺寸的圓圈

<ProgressBar

android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>

3、顯示為小的尺寸的圓圈

<ProgressBar

android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>

可以直接設置 layout_width 和 layout_height為具體的值,來控制圓圈的半徑。

4、顯示為直條形的

<ProgressBar

android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>

對於直條形的樣式,不僅可以讓它向圓形一樣,默認就是進度不停變化;而且還可以精確控制其進度,下面會重點介紹。

二 、直條形進度條

設置為一直在旋轉的樣式

<ProgressBar
android:id="@+id/progress1"

android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:indeterminate="true"
/>

設置indeterminate屬性為true,就可以顯示時進度條一直在變化,該屬性默認是false的。

如果想讓它停止變化,可以通過代碼控制:

ProgressBar pro1 = (ProgressBar) findViewById(R.id.progress1);

pro1.setIndeterminate(false);

如果想讓它停止時,進度顯示完成,可以如下代碼:

pro1.setProgress(100);  

注意進度條的默認最大大小是100,可以通過setMax來設置自己需要的值。

三、精確控制進度(和AsyncTask結合)

代碼如下

	public void startProgress(View view) {
		final ProgressBar pro1 = (ProgressBar) findViewById(R.id.progress1);
		new AsyncTask<Integer, Integer, Integer>() {
			@Override
			protected Integer doInBackground(Integer... params) {
				for (int i = 1; i <= 100; i++)
					doSomethingTask(i);
				return 100;
			}

			private void doSomethingTask(int num) {
				try {
					Thread.sleep(50);
					publishProgress(num);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}

			@Override
			protected void onPostExecute(Integer result) {
				TextView resultView = (TextView) findViewById(R.id.resultText);
				resultView.setVisibility(View.VISIBLE);
				resultView.setText("the result is " + result);
				super.onPostExecute(result);
			}

			@Override
			protected void onProgressUpdate(Integer... values) {
				pro1.setProgress(values[0]);
				super.onProgressUpdate(values);
			}

		}.execute(1);
	}

在AsyncTask的doInBackground方法中執行後台任務(實際上是在另外線程中執行,如io操作、網絡操作。在這個方法中不能操作界面組件),如果想讓進度條顯示中間的進度,就可以在後台任務的執行過程中調用publishProgress方法發送進度。而執行publishProgress方法,會觸發onProgressUpdate方法(該方法在主線程中進行,可以在該方法中更新界面組件,這裡更新的是進度條的進度)。當doInBackground方法執行完畢後,會觸發onPostExecute方法(該方法在主線程中進行,可以在該方法中更新界面組件),可以在該方法中顯示任務完成後的界面,上面例子是在本文view顯示下信息。

通過上面的代碼和例子,基本上就可以滿足大部分場景。最後提一點的是,ProgressBar的進度只能通過代碼控制,無法讓用戶拖動。如果想要讓用戶能夠拖動進度(比如在視頻或音頻播放界面),可以使用SeekBar組件。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved