自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。
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////