Android之ActionBar詳解
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。
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////