亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

解析android中ProgressBar的用法

2020-04-11 12:11:00
字體:
來源:轉載
供稿:網友

范例說明
Android的Widget,有許多是為了與User交互而特別設計的,但也有部分是作為程序提示、顯示程序運行狀態的Widget?,F在介紹的范例,與前一章介紹過的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"

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
55夜色66夜色国产精品视频| 中文字幕视频在线免费欧美日韩综合在线看| 91成人在线观看国产| 久久久久国产精品www| 国产成人精品视频在线| 国产精品国内视频| 国产欧美精品久久久| 国产精品99免视看9| 久久久国产精品免费| 国外色69视频在线观看| 国产亚洲美女久久| 久久亚洲一区二区三区四区五区高| 91av视频导航| 国产精品自拍偷拍视频| 国产成人精品亚洲精品| 色伦专区97中文字幕| 国产精品2018| 另类少妇人与禽zozz0性伦| 欧美激情视频在线观看| 亚洲第一网站免费视频| 亚洲国产精品久久久久| 亚洲片国产一区一级在线观看| 日韩精品中文字幕在线| 欧美成人免费全部观看天天性色| 国模视频一区二区三区| 欧美性高潮在线| 成人写真视频福利网| 日韩高清电影免费观看完整版| 欧美精品在线播放| 狠狠躁夜夜躁久久躁别揉| 国产精品人成电影| 国模视频一区二区| 日韩av在线一区| 91tv亚洲精品香蕉国产一区7ujn| 亚洲成人久久久久| 午夜精品一区二区三区在线视| 久久久电影免费观看完整版| 亚洲欧美在线免费观看| 亚洲欧美中文日韩v在线观看| 成人免费视频在线观看超级碰| 91精品国产自产在线观看永久| 欧美一级片久久久久久久| 欧美成人午夜影院| 久久亚洲精品小早川怜子66| 亚洲一二在线观看| 亚洲成色777777女色窝| 国产亚洲精品va在线观看| 国产精品小说在线| 欧美一级淫片aaaaaaa视频| 成人黄色网免费| 久久亚洲精品网站| 国产精品美女免费看| 中国日韩欧美久久久久久久久| 青草青草久热精品视频在线网站| 欧美日韩福利在线观看| 欧美一区二区三区免费观看| 久久国产精品久久久久| 亚洲天堂av高清| 欧洲亚洲女同hd| 日本午夜在线亚洲.国产| 欧美在线视频导航| 日韩亚洲精品视频| 午夜精品三级视频福利| 在线午夜精品自拍| 国产日韩欧美另类| 亚州成人av在线| 91av在线播放| 最近2019年日本中文免费字幕| 国产精品丝袜一区二区三区| 尤物精品国产第一福利三区| 色www亚洲国产张柏芝| 欧美午夜视频在线观看| 国产成人高潮免费观看精品| 精品免费在线视频| 国产日韩欧美一二三区| 欧美日韩一区二区精品| 亚洲专区国产精品| 国色天香2019中文字幕在线观看| 国产成人精彩在线视频九色| 亚洲成人精品视频在线观看| 国产成人精品一区二区三区| 久久99国产精品自在自在app| 亚洲精品在线观看www| 97激碰免费视频| 4438全国成人免费| 欧美精品福利视频| 国产精品999999| 成人信息集中地欧美| 久久久精品2019中文字幕神马| 亚洲欧美制服综合另类| 米奇精品一区二区三区在线观看| 久久精视频免费在线久久完整在线看| 在线观看国产欧美| 韩国福利视频一区| 午夜欧美不卡精品aaaaa| 最新国产精品亚洲| 91精品久久久久久久久不口人| 欧美激情精品久久久久久久变态| 91精品在线影院| 日本精品视频在线观看| 欧美国产日韩一区二区三区| 国产在线视频欧美| 亚洲精品美女视频| 久久成年人免费电影| 国产日韩在线亚洲字幕中文| 超在线视频97| 日韩在线观看av| 国产欧美日韩中文字幕在线| 欧美黑人极品猛少妇色xxxxx| 色综合五月天导航| 中文字幕久热精品视频在线| 久久天天躁夜夜躁狠狠躁2022| 亚洲国产精品成人一区二区| 91免费看视频.| 日韩国产高清污视频在线观看| 黄色一区二区在线| 91av在线不卡| 2021久久精品国产99国产精品| 亚洲天堂日韩电影| 亚洲欧美日韩精品久久奇米色影视| 久久久久国色av免费观看性色| 国产精品xxx视频| 色播久久人人爽人人爽人人片视av| 亚洲高清一二三区| www.亚洲成人| 98视频在线噜噜噜国产| 国产精品永久免费观看| 亚洲欧美在线免费观看| 久久久成人精品| 5278欧美一区二区三区| 精品视频9999| 久久精品国产亚洲一区二区| 日韩欧美a级成人黄色| 欧美亚洲成人xxx| 国产日韩欧美成人| 中文字幕亚洲综合| 国产精品永久免费视频| 日韩国产高清污视频在线观看| 在线日韩欧美视频| 亚洲91精品在线| 成人黄色在线播放| 高清日韩电视剧大全免费播放在线观看| 国产精品高清在线| 欧美日韩国产丝袜美女| 欧美小视频在线观看| 成人在线精品视频| 欧美在线一区二区三区四| 在线播放日韩av| 国产一区二区免费| 这里只有精品久久| 久久精品99国产精品酒店日本| www日韩中文字幕在线看| 欧美亚洲一区在线| 国产性猛交xxxx免费看久久| 国内精品模特av私拍在线观看| 日韩中文字幕视频在线观看| 亚洲国产精品嫩草影院久久| 欧美一级淫片aaaaaaa视频| 日韩欧美在线播放| 久久亚洲综合国产精品99麻豆精品福利| 日韩电视剧在线观看免费网站| 日韩电影在线观看免费| 中文字幕欧美日韩va免费视频| 欧美亚洲国产成人精品|