1. 程式人生 > >Android之ActionBar詳解

Android之ActionBar詳解

自android3.0來Action Bar就取代了OptionsMenu。於是就涉及了API的設定。

    1)        設定<uses-sdk android:minSdkVersion="4"  android:targetSdkVersion="11" />,表明應用程式可部署於android3.0或之前。也就是說當裝置的SdkVersion==11時,應用程式將啟動Action Bar。
但是如何應用程式想使用Action Bar API,即訪問ActionBar類。例如:新增tab、改變Action Bar風格,我們需要將minSdkVersion也設定成11。

    2)        如何讓你的Activity不使用ActionBar呢?

            i.      設定:<activity android:theme="@android:style/Theme.Holo.NoActionBar">

            ii.      i中的主題是系統自帶的主題,即去掉了ActionBar的主題。如果我們自定義主題,如何取消ActionBar呢?
在自定義的主題中,使用android:windowActionBar,並將它設定成false。

    3)        值得注意的是,當用2)的方法刪除了ActionBar後,在Activity中呼叫getActionBar()將返回null。
否則正常情況下返回ActionBar物件,然後呼叫show、hide操作。

    4)        定義了OptionsMenu之後,我可以選擇幾個MenuItem優先顯示在Action Bar。

            i.      在menu資源中:使用android:showAsAction屬性,設定成ifRoom。

            ii.     程式碼中:MenuItem .setShowAsAction(SHOW_AS_ACTION_IF_ROOM)

    5)        通常MenuItem是帶有Icon和text屬性,作用是提示使用者識別MenuItem。當兩者都提供時,Action Bar預設顯示Icon。如果想顯示文字的話,需要

            i.       在menu資源中:使用android:showAsAction屬性,設定成ifRoom | withText。

            ii.      程式碼:MenuItem .setShowAsAction(SHOW_AS_ACTION_IF_ROOM | SHOW_AS_ACTION_WITH_TEXT)

    6)        如果應用程式在某個Fragment中新增MenuItem,當點選該MenuItem的處理步驟是這樣,Activity本身先處理,然後才會到Fragment。

    7)        預設情況下,Action Bar會在最左側新增應用程式圖示,當點選該圖示與點選MenuItem的效果是一致的,此時返回的id是android.R.id.home。同樣也是在onOptionsItemSelected中處理。

            i.        通常的處理是返回首頁,結束冗長的Activity棧。
           
           

            ii.       另一種常見的處理是向上導航功能,即可選擇Activity棧中任意Activity。程式碼和效果如下,onOptionsItemSelected中的處理類似於i中的程式碼:
           
           

    8)        預設情況下,Action Bar上顯示的MenuItem,都是以MenuItem的Icon或者Text顯示。
我們可以為MenuItem新增View,從而在Action Bar上顯示這個View,注意,如果Action Bar空間不足以顯示該View的話,此時MenuItem就處於”更多”選單中,此時顯示Icon或者Text,而不是View了。
如何定義的的,通常都是在資源中為使用或者屬性。例如:

           
此時我們通常會為該View設定監聽器與使用者互動。如何在menu資源中獲取MenuItem對應的View呢?
           

    9)        Android為Action Bar提供支援Tab的功能,效果如下:
           

            i.      每個Tab都包含一個Icon和Text。通常每個Tab對應一個Fragment

            ii.      實現該效果的基本步驟
getActionBar().setNavigationMode(NAVIGATION_MODE_TABS)。在Activity的onCreate呼叫了setContextView之後才能呼叫getActionBar()。
建立ActionBar.Tab物件:actionBar.newTab(),這裡actionBar是物件不是類。
呼叫Tab.setText、setIcon和setTabListener。其中TabListener關聯了Fragment。這樣就實現了Tab與Fragment的關聯。
最後ActionBar.addTab()新增Tab即可。

            iii.      TabListener結構如下:
           

            iv.      getSelectedNavigationIndex()能夠獲取被選擇的Tab索引,當用戶切換前後臺的Activity時,根據被選擇的Tab恢復介面。

    10)     一個網站,遊戲等都需要導航,除了Tab導航之外,android系統又為Action Bar提供了下拉導航功能。

            i.        getActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);使能下拉導航功能。

            ii.        actionBar.setListNavigationCallbacks(mSpinnerAdapter, mNavigationCallback);設定下拉導航中的導航項和點選導航項後的事件處理。
mSpinnerAdapter是SpinnerAdapter類例項,即這裡的所有導航項。
mNavigationCallback是ActionBar.OnNavigationListener類例項,即事件監聽處理器。

            iii.       建立SpinnerAdapter
SpinnerAdapter mSpinnerAdapter = ArrayAdapter.createFromResource(this, R.array.action_list, android.R.layout.simple_spinner_dropdown_item);
引數1:Context
引數2:字串陣列資源<string-array name="action_list">
引數3:下拉導航中每個導航項的佈局。

            iv.       建立ActionBar.OnNavigationListener
該事件監聽器主要處理,當導航項被點選時的處理:onNavigationItemSelected。
public boolean onNavigationItemSelected(int position, long itemId) 。

    11)     Action Bar(動作欄)也是UI的一部分,如何讓它和Activity的UI的風格協調一致呢?

            i.     ActionBar.setBackgroundDrawable成員設定Action Bar的背景圖片,建議不要使用固定畫素的圖片。

            ii.    ActionBar.setDisplayUseLogoEnabled成員設定Actin Bar上顯示的Icon。不再使用Application的Icon,而是使用<application>中android:logo。

            iii.    還有就是為Action Bar應用主題,預設情況Action Bar使用Theme.Holo主題。它與Theme.Holo.Light相反的主題,後者是白底黑字。
設定方法是這樣的,在manifest.xml中為Activity新增主題。當然該主題不僅僅包括的是Action Bar的樣式。

            iv.    關於Action Bar的樣式:
android:actionBarTabStyle:Tab的樣式
android:actionBarTabBarStyle:Tab下方的Bar的樣式
android:actionBarTabTextStyle:Tab中Text的樣式
android:actionDropDownStyle:下拉導航和浮動選單的樣式
android:actionButtonStyle:按鈕的背景圖片

            v.     如何自定義主題呢?通常的做法是繼承的方式,例如繼承Theme.Holo:
       

            vi.      應用該自定義的主題就很簡單了:
<application android:theme="@style/CustomActionBar"... />

            vii.     當然如果你的Activity不使用Action Bar也就沒有以上的部分了。
設定Activity的android:windowActionBar為false即可。

            viii.     拓展:設定Activity的android:windowNoTitle來使能題目欄Title Bar。

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////