Photo by lilzidesigns on Unsplash
在 Android 中,提供了 ProgressBar 進度條 、SeekBar 拖動條和 RatingBar 評分條等元件。若要呈現某作業的完成進度百分比,可使用 ProgressBar 元件表示,若要使用者透過拖動滑塊來改變值或進度的元件稱為 SeekBar 元件,而使用星星圖案表示進度的元件稱為 RatingBar,一般作為給予評分用的會使用 RatingBar。本篇先來瞭解如何使用 ProgressBar。
[ProgressBar]
當一個 APP 在背景執行時,例如下載檔案或系統更新,使用者介面上是不會有任何資訊的,使用者不知道背景程式何時會結束,也不知道執行的進度及回應狀況,這時會使用 ProgressBar 來讓使用者知道執行的進度。當 ProgressBar 進度到了最右邊時,表示這項工作完成。在 Android 的 XML 佈局檔中使用 <ProgressBar>作為標記新增 ProgressBar,基本語法格式如下:<ProgressBar android:屬性 = "值"> </ProgressBar>
ProgressBar 元件繼承自 View,因此 ProgressBar 可以使用 View 相關的屬性,除了 View 可用的屬性外,還有以下幾種:
XML屬性 | 描 述 |
---|---|
max | 設定 ProgressBar 的最大值。 |
progress | 設定 ProgressBar 已完成的進度值。 |
progressDrawable | 設定 ProgressBar 軌道的繪製形式。 |
indeterminate | 是否顯示不確定模式,預設為 true。 |
style | 設定 ProgressBar 的外觀樣式。 |
style 的撰寫方式跟一般的屬性有點不同,寫法如下:
<ProgressBar android:layout_width= "wrap_content" android:layout_height= "wrap_content" style= "@android:style/Widget.ProgressBar.Horizontal" />在 Android 中,提供了兩種 ProgressBar的 style 屬性:水平及圓形的樣式,預設為圓形的 ProgressBar。者兩種的樣式又可分成大小等不同樣式,style 可設定的屬性如下:
XML屬性 | 描述 |
---|---|
?android:attr/progressBarStyleHorizontal | 細水平長條 ProgressBar |
?android:attr/progressBarStyleLarge | 大圓形 ProgressBar |
?android:attr/progressBarStyleSmall | 小圓形 ProgressBar |
@android:style/Widget.ProgressBar.Horizontal | 粗水平長條 ProgressBar |
@android:style/Widget.ProgressBar.Large | 大跳躍、旋轉畫面的 ProgressBar |
@android:style/Widget.ProgressBar.Small | 小跳躍、旋轉畫面的 ProgressBar |
@android:style/Widget.ProgressBar.Inverse | 大跳躍、反白旋轉畫面的 ProgressBar |
上表的各種 Style 樣式呈現的結果如下:
ProgressBar 元件還提供了下面兩個常用方法用於操作進度:
- setProgress(int progress) 方法:用於設置進度完成的百分比。
- incrementProgressBy(int diff) 方法:用於設置進度條的進度增加或減少。當參數值為正數時, 表示進度增加;當參數值為負數時,表示進度減少。
以下程式範例使用執行緒的方式搭配數字百分比來呈現 ProgressBar 進度。
[程式範例]
(1)新建一個模組 Module,進入 res/layout 目錄下點選佈局檔 activity_main.xml。將預設的內容刪除,建立 1 個 TextView 文字框,1 個 ProgressBar,以及 1 個 Button 按鈕,以下是完整 XML 的內容。<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/pcnt" android:layout_width="wrap_content" android:layout_marginTop="50sp" android:layout_gravity="center_horizontal" android:layout_height="50sp" android:textColor="#FFDD5500" android:text="" android:textSize="30dp" /> <ProgressBar android:id="@+id/pb" style="?android:attr/progressBarStyleHorizontal" android:layout_width="match_parent" android:layout_height="50sp" android:max="100" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="20sp" android:onClick="download" android:text="Download" /> </LinearLayout>
(2)在 MainActivity.java 在 onCreate() 方法內,先建立與佈局檔的物件,用 findValueById 連結元件,在下載的按鈕建立一個 onClick() 程序,讓這個程序呼叫建立執行緒,執行緒內建立迴圈每 1.5 秒檢查是否已經超過 100,如果還沒超過,會呼叫 MyHandler 類別,顯示數字百分比在 TextView 上。程式碼如下:
package com.example.myprogressbar; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.TextureView; import android.view.View; import android.widget.ProgressBar; import android.widget.TextView; public class pb_MainActivity extends AppCompatActivity { private int pg = 0; private ProgressBar pb; private TextView pcnt; private MyHandler myHandler = new MyHandler(); // 建立一個新的 Handler 類別 public class MyHandler extends Handler { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case 1: pg++; pb.setProgress(pg); // 給 ProgressBar 當前的進度值 pcnt.setText(pg + "%"); // 顯示當時的進度值 break; } } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_pb_main); pb = (ProgressBar) findViewById(R.id.pb); pcnt = (TextView) findViewById(R.id.pcnt); } // 點擊 Download 按鈕 public void download(View v) { if(pg == 0){ //當進度為 0 時 new myThread().start(); //建立多線程 Thread 程序 } } public class myThread extends Thread{ @Override public void run() { super.run(); while(true){ try { Thread.sleep(150); // 暫停 0.15 秒 } catch (InterruptedException e) { e.printStackTrace(); } if(pg >= 100){ //若超過 100 時,離開程式 pg = 0; break; } Message msg=new Message(); msg.what=1; myHandler.sendMessage(msg); // 代碼傳給 Handler } } } }
執行的結果如下:
[參考資料]
- Developer : ProgressBar
- CSDN:Android中的常用控件之进度条(ProgressBar)
張貼留言