前言
Android裡的很多控制項,有許多是為了與使用者進行互動的,也有一些是為了作為程式提示,顯示程式運行狀態的。在這裡我們介紹一下ProgressBar控制項的使用,它就是作為顯示程式運行狀態存在的。
思路
在這個應用一開始是看不到進度條的,我們布局一個按鈕,然後單擊這個按鈕,再然後我們建立一個新的進程來假裝程式很”忙碌“,可以在進程當中取得運行時的進度,在運行過程中,將啟動並執行進度通過TextView顯示出來。
因為這個進程是新開啟的,新開啟的進程無法訪問Activity裡的控制項,也就無法把運行狀態傳遞出來,所以我們要通過Handler和Message對象將新開啟的進程裡的狀態傳遞出來,最後由Activity的Handler事件接收取得的運行狀態。
實現步驟
一:布局檔案編寫
1.1:布局檔案main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
android:id="@+id/tv"
/>
<ProgressBar
android:id="@+id/pb"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="300dp"
android:layout_height="wrap_content"
android:max="200"
android:visibility="gone"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="運行進程"
android:id="@+id/btn"
/>
</LinearLayout>
二:代碼檔案編寫
2. 1:MainActivity.java
package com.menglin.progressbarandhandler;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
public class MainActivity extends Activity
{
//自訂Handler資訊代碼,用以作為識別事件處理
protected static final int GUI_STOP_NOTIFIER = 0;
protected static final int GUI_THREADING_NOTIFIER = 1;
//聲明一個Button對象btn
private Button btn;
//聲明一個TextView對象tv
private TextView tv;
//聲明一個ProgressBar對象pb
private ProgressBar pb;
//進度條計數器
private int intCount = 0;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
//載入布局檔案main.xml
setContentView(R.layout.main);
//通過findViewById()方法得到Button對象
btn = (Button)findViewById(R.id.btn);
//通過findViewById()方法得到TextView對象
tv = (TextView)findViewById(R.id.tv);
//通過findViewById()方法得到ProgressBar對象
pb = (ProgressBar)findViewById(R.id.pb);
//調用setIndeterminate()方法Indeterminate賦值為false,我們翻閱Android的SDK得到以下資訊,Change the indeterminate mode for this progress bar 意思是說以不確定的方式改變這個進度條,也就是說可以改變進度條的指示
pb.setIndeterminate(false);
//給按鈕綁定單擊事件
btn.setOnClickListener(listener);
}
//定義匿名Handler內部類用來處理從訊息佇列中取出的訊息
Handler MessageHandler = new Handler()
{
//當從訊息佇列中取出訊息對象會自動調用此方法
public void handleMessage(Message message)
{
switch (message.what)
{
//當離開進程時
case MainActivity.GUI_STOP_NOTIFIER:
//設定TextView的文本資訊為“運行進程完畢”
tv.setText(R.string.end);
//將ProgressBar設定為可為不可見
pb.setVisibility(View.GONE);
//終止當前的線程
Thread.currentThread().interrupt();
break;
//當還在進程中時
case MainActivity.GUI_THREADING_NOTIFIER:
//如果線程沒有被中斷
if(!Thread.currentThread().isInterrupted())
{
//設定進度條的進度標識
pb.setProgress(intCount);
//設定TextView的文本資訊為“載入中...請稍後(%百分比%)”
tv.setText(getResources().getText(R.string.start)+ "(" + Integer.toString(intCount) + "%}");
}
break;
}
}
};
//單擊事件
private OnClickListener listener = new OnClickListener()
{
@Override
public void onClick(View v)
{
//將ProgressBar設定為可見
pb.setVisibility(View.VISIBLE);
//設定ProgressBar初始為0
pb.setProgress(0);
//設定ProgressBar最多為100
pb.setMax(100);
//開啟一個新的線程
new Thread(new Runnable()
{
// run()方法裡面的代碼會被自動調用
public void run()
{
for(int i = 0;i < 10; i++)
{
try
{
//計數器用以識別載入的進度
intCount = (i + 1) * 10;
//每運行一次迴圈休眠1秒
Thread.sleep(1000);
//當進程運行9秒後顯示運行結束
if(i == 9)
{
//將Message作為參數傳遞給Handler
Message message = new Message();
//自訂訊息的代碼以便進行相應的處理
message.what = MainActivity.GUI_STOP_NOTIFIER;
//發送Message對象,把Message對象壓入到訊息佇列的末尾,在handleMessage它將被接收 MessageHandler.sendMessage(message);
}
else
{
//將Message作為參數傳遞給Handler
Message message = new Message();
//自訂訊息的代碼以便進行相應的處理
message.what = MainActivity.GUI_THREADING_NOTIFIER;
//發送Message對象,把Message對象壓入到訊息佇列的末尾,在handleMessage它將被接收MessageHandler.sendMessage(message);
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
}).start();
}
};
}
三:常量檔案
3.1 strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello World, MainActivity!</string>
<string name="app_name">ProgressBarAndHandlerDemo</string>
<string name="start">載入中...請稍後</string>
<string name="end">運行進程完畢</string>
</resources>
執行流程
運行效果如下