国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

解析android中ProgressBar的用法

2020-02-21 17:27:46
字體:
來源:轉載
供稿:網友

在android中,progressbar表示進度條,向用戶顯示耗時的操作是否完成,今天這篇文章是武林技術頻道小編為大家帶來的解析android中ProgressBar的用法,一起跟著小編的步伐來學習吧!

范例說明
Android的Widget,有許多是為了與User交互而特別設計的,但也有部分是作為程序提示、顯示程序運行狀態的Widget。現在介紹的范例,與前一章介紹過的ProgressDialog對話框的應用目的相似,但由于前章介紹的ProgressDialog是繼承自Android.app.ProgressDialog所設計的互動對話窗口,在應用時,必須新建ProgressDialog對象,在運行時會彈出“對話框”作為提醒,此時應用程序后臺失去焦點,直到進程結束后,才會將控制權交給應用程序,如果在Activity當中不希望后臺失焦,又希望提示User有某后臺程序正處于忙碌階段,此時,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:id="@+id/myProgressBar1"
? android:layout_width="wrap_content"
? android:layout_height="wrap_content"
? android:max="100"
? android:progress="0"
? android:orientation="horizontal"
? android:progressBarStyle=
? "@android:style/Widget.ProgressBar.Horizontal"
? android:indeterminateOnly="false"
? android:visibility="gone"
/>


ProgressBar除了上述關于Android:progressBarStyle的屬性設置之外,筆者也調查了在線Android的源代碼(http://source.android.com),一些原本Android所使用的progressBarStyleHori- zontal屬性,除默認“圓形”的圖片之外,還有其他的主題及方形圖片Drawable模式可以使用。

?

?

?


<resources>
? <declare-styleable name="Theme">
? <!-- snip -->
? <attr name="progressBarStyleHorizontal" format="reference" />
</resources>


接下來看看,這段主題中的屬性名稱progressBarStyleHorizontal定義在frameworks/base/ core/res/res/values/ styles.xml里,如下所示:

?

?

?


<resources>
? <style name="Widget.ProgressBar.Horizontal">
??? <item name="android:indeterminateOnly">false</item>
??? <item name="android:progressDrawable">
????? @android:drawable/progress_horizontal
??? </item>
??? <item name="android:indeterminateDrawable">
????? @android:drawable/progress_indeterminate_horizontal
??? </item>
??? <item name="android:minHeight">20dip</item>
??? <item name="android:maxHeight">20dip</item>
? </style>
</resources>


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

?

?

?


android:progressDrawable="@android:drawable/progress_horizontal"
android:indeterminateDrawable=
"@android:drawable/progress_indeterminate_horizontal"

以上就是解析android中ProgressBar的用法,小編覺得大家還是需要多學習一些專業知識,專業的知識,你可以來武林技術頻道進行學習。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 定州市| 稻城县| 南安市| 哈巴河县| 六枝特区| 大同市| 阿克苏市| 惠东县| 漾濞| 凤冈县| 繁昌县| 九江市| 丹江口市| 平陆县| 郸城县| 嘉义县| 泸定县| 绵竹市| 池州市| 集安市| 九龙坡区| 樟树市| 怀化市| 湘乡市| 台东县| 靖江市| 隆安县| 白银市| 马鞍山市| 金坛市| 辽宁省| 鄄城县| 屏南县| 交城县| 光泽县| 稷山县| 永嘉县| 阜宁县| 上栗县| 嘉荫县| 临颍县|