使用android ProgressBar和Toast生成一個界面

首先我須要這樣一個界面android

這個界面是在使用AudioManager.adjustStreamVolume(int streamType, int direction, int flags)顯示出來的,記住flags這裏傳 AudioManager.FLAG_SHOW_UI纔會顯示佈局

否則只是邏輯上調整了某個流的聲音,用戶他看不到界面不知道成功與否。測試

而後我有一個功能界面是和這個同樣的,但功能不同,好吧,我知道android自帶的界面並很差看,但這裏只是說明原理和方法,美觀不予討論。spa

這裏核心的2個組件就是一個TextView和ProgressBar。若是自定義的話,須要寫一個layout來包裹這2個組件 而後當點擊一個按鈕時顯示出來。.net

讓咱們在回到android自帶的界面中,當他點擊一個按鈕時,他會彈出來而且隔一會就會自動消失。這個自動消失我以爲頗有用,由於用戶只須要調整那一會code

能看到界面的改變就好了,不須要一直顯示,否則還要讓用戶在點個返回?多麼麻煩呢,操做簡單纔是重要的。orm

因而我想到了android 自帶的toast有這個功能。好的!大方向肯定了,就開始寫代碼吧xml

邏輯是這樣的讓用戶點擊某個按鈕時,彈出上面那個界面,而後過一會消失,這裏在顯示toast的時候還須要調用改變進度條進度的方法。接口

接下來上代碼吧:ip

複製代碼

    // ////////////////////////先生成一個toast和progress界面
       pb = new ProgressBar(context, null,

               android.R.attr.progressBarStyleHorizontal);
       pb.setMax(GameConfig.GameSpeedMax);
       pb.setProgress(GameConfig.GameSpeedDefault);
       pb.setLayoutParams(new LinearLayout.LayoutParams(
               ExtensionLayoutConfig.ProgressBarWidth,
               LinearLayout.LayoutParams.WRAP_CONTENT));
       toast = Toast.makeText(context,
               RFileIDConvert.getString("gameSpeedBarTitle"),
               Toast.LENGTH_LONG);
       toast.setGravity(Gravity.TOP, 0, 0);
       LinearLayout toastView = (LinearLayout) toast.getView();
       toastView.setGravity(Gravity.CENTER);
       //請注意這裏傳1是必要的,由於他的textView已經在建立的時候添加進去了,若是你傳0
       
//那麼上面會先顯示進度條 下面再顯示文字,若是你須要的話能夠這麼作,但我如今須要
       
//文字在上方 進度條在下面 so 傳1
       toastView.addView(pb, 1);

複製代碼

 

 

下面是給外部調用的2個接口:

複製代碼

    /**
    * 設置進度
   
*/

   public void setGameSpeedBarProgress(int progress) {
       pb.setProgress(progress);
   }
   /**
    * 顯示toast
   
*/

   public void gameSpeedBarShow() {
       toast.show();
   }

複製代碼

出來的效果是這樣

發現和原來的相比沒那麼大氣,因此還須要調整下間距,這個簡單 我明天再完善它, 大概功能就是這樣了。

總結。你們請不要小看這麼一個界面,我剛開始也以爲很容易,可實現起來發現的問題也很多。

1.通常佈局我習慣用代碼佈局,但碰到ProgressBar我只能無語。在代碼中默認的風格是環形的,在XML佈局中默認的是水平的

xml中他默認是這麼設置的 <ProgressBar  style="?android:attr/progressBarStyleHorizontal"

呵呵,難點出來了,這個若是你想用代碼設置的話,告訴你很抱歉沒有設置風格的方法。有人會說了ProgressBar  中不是有個setScrollBarStyle(int style)方法麼。

那麼我請你測試完了在說話。這個方法是無效的,請看API的描述。而後我查源碼想找出水平方向風格使用了那些設置接口,

咱們能夠看下progressBarStyleHorizontal樣式中給View設置了哪些屬性,咱們找到framework下的res目錄下的values/Theme.xml文件,搜索progressBarStyleHorizontal會發現以下行:

 <item name="progressBarStyleHorizontal">@android :style/Widget.ProgressBar.Horizontal</item>

該主題對應的Widget樣式是Widget.ProgressBar.Horizontal,咱們在一樣的的目錄下打開style.xml文件,搜索該樣式,能夠找到以下代碼:

  <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>

好了,看到這裏告訴你,你能夠不使用<item name="progressBarStyleHorizontal">@android :style/Widget.ProgressBar.Horizontal</item>

而使用

android:indeterminateOnly="false"

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

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

android:minHeight="20dip"

android:maxHeight="20dip" />

一樣能夠實現水平進度條。我知道你們都會使用那一行而不使用這麼多行。我明白,我只是告訴你原理而已。

好的,你知道我喜歡使用代碼佈局的,而後走代碼路線則是

複製代碼

progressBar.setIndeterminate(false);

       progressBar.setProgressDrawable(getResources().getDrawable(android.R.drawable.progress_horizontal));

       progressBar.setIndeterminateDrawable(getResources().getDrawable(android.R.drawable.progress_indeterminate_horizontal));

       progressBar.setMinimumHeight(20);

複製代碼

 

結果是ProgressBar確實變成了橫條,但並無顯示成進度條的樣子,咱們仔細對比一下純Java代碼和xml佈局文件之間差別,咱們發現

android:indeterminateOnly="false"和 progressBar.setIndeterminate(false);

並不徹底同樣佈局文件的屬性有一個Only結尾但代碼中並無,咱們查找Api發現並無setIndeterminateOnly這樣的一個方法。

咱們打開ProgressBar的源代碼,找到.setIndeterminate(false) 方法。

 

咱們這時候能夠發現Indeterminate和IndeterminateOnly並非同一個東西,

這時咱們應該想的到,只要咱們把IndeterminateOnly的值變成false就可使ProgressBar變成進度條的樣式,

咱們查找全部的代碼,發現並無提供相應的公開方法來修改該屬性的值。

 

 

也就是說,咱們討論了那麼久發現根本就沒法經過純代碼的形式來建立一個水平進度條樣式的ProgressBar.

可是。。。某人說可使用反射改變一個類的私有變量的值。內容比較抽象,這裏仍是略過吧,由於我發現它必須知道變量名才能反射成功,

但我查詢後發現有些版本的變量名是不同的咧,這個版本用的mIndeterminateOnly,那個版本用的mOnlyIndeterminate(2.2版)

因此這個地方我果斷放棄了純代碼佈局,使用

ProgressBar pb = new ProgressBar(context, null,android.R.attr.progressBarStyleHorizontal);  安逸了~~~~ 這只是第一個問題哦

2.使用toast的時候須要注意,若是你須要那個背景框就必須makeToast. 若是你喜歡乾淨的話 可使用new Toast(context)而後再設置一些屬性之類的

若是隻想要toast的短暫顯示的功能,界面徹底自定義的話 推薦使用new Toast(context),最後你們要養成看源碼的習慣哦,有時候仍是須要本身動手,

豐衣足食啊

相關文章
相關標籤/搜索