標籤:
Action Bar在實際應用中,很好地為使用者提供了導航,視窗位置標識,操作點擊等功能。它出現於Android3.0(API 11)之後的版本中,在2.1之後的版本中也可以使用。
添加與隱藏Action Bar
在3.0之後的版本中(android:minSdkVersion 或者 android:targetSdkVersion 屬性被設定成11或者更高),預設在activity中添加了Action Bar,不用額外添加。如果不想在activity中使用Action Bar,我們可以通過設定activity的主題來實現。
在程式運行過程中,也可以動態隱藏或者顯示Action Bar:
動態顯示或隱藏將引起當前的activity介面重繪。如果需要頻繁的顯示或隱藏,可以使用overlay模式,將一個action bar固定在當前activity介面上方,無論顯示或隱藏都不會使activity介面重繪。
為Action Bar添加Item
action bar上通常放置著最常用的item便於使用者進行操作,那些不重要的item會被隱藏於overflow 的item中。Item通常被預定義於menu資源檔中,如下:
當一個activity啟動後,在onCreateOptionsMenu()方法來填充ab中預設的item。
在item的showAsAction屬性中,選項含義如下:
- never:永遠不會顯示。只會在溢出列表中顯示。
- ifRoom:會顯示在Item中,但是如果已經有4個或者4個以上的Item時會隱藏在溢出列表中。
- always:無論是否溢出,總會顯示。
- withText:Title會顯示。
- collapseActionView:可拓展的Item。
處理item事件
當使用者觸發item的點擊事件後,通過 onOptionsItemSelected() 方法來處理事件,如下:
通過APP表徵圖返回上一層
單擊app表徵圖回退上一層功能與單擊back返回按鈕是完全不同的兩個功能,後者是根據時間的順序,向後返回到上一個使用者操作介面,而不是根據app的階層返回。
啟用向上一層返回功能,需要調用 setDisplayHomeAsUpEnabled()方法:
除此之外,我們還需要指定向上返回到哪個activity,根據不同情況有兩種方式:
當前activity有唯一的父activity A,即能從A這個activity跳轉到當前的activity,那麼可以通過在manifest檔案中指定父activity:
如果有多個父activity,則通過複寫getSupportParentActivityIntent() 和onCreateSupportNavigateUpTaskStack()方法來指定要回到哪個activity。
當使用者在同一個app的若干層activity中進行操作時,單擊UP進行回退,此時系統會調用getSupportParentActivityIntent()方法。由於可能存在多個父activity,在此方法中可以返回一個啟動父activity的Intent。
當使用者在進行跨app的多層activity中進行操作時,單擊UP進行回退,系統會調用onCreateSupportNavigateUpTaskStack()方法。此時,需要將TaskStackBuilder 傳遞給該方法,構造相應的回退棧。
即使複寫了getSupportParentActivityIntent()方法來指定在本app中回退的操作後,並不是一定要複寫onCreateSupportNavigateUpTaskStack()方法,通過在manifest檔案中指定預設activity即可。
添加Action View
在action bar上添加action view這種小外掛程式,可以協助使用者在不改變當前activity或fragment的情況下完成一些功能,例如搜尋等等。
通過在menu檔案的item中聲明actionLayout 或actionViewClass屬性來指定需要使用的布局檔案或者類,例如添加一個搜尋控制項:
在menu檔案中添加完成後,可以在onCreateOptionsMenu()方法中擷取並配置該action view:
通過將擷取到的menuItem項傳遞給getActionView方法取得該action view,如果在11版本之上,則直接調用getActionView即可:
通過指定collapseActionView屬性可以讓action view摺疊起來,單擊後又會出現,此時系統會自動回調onOptionsItemSelected()方法,如果你將其返回結果為true(意味著你已經處理了該事件,不要將該事件繼續傳遞下去),則action view將無法展開。
添加Action Provider
與action view相似,action provider使用定製的布局來取代了固定的action button. 它將一系列action放入子功能表,單擊它會展示出來。
因為action provider定義了自身的action行為,所以無需在onOptionsItemSelected()方法中監聽點擊事件。
通過指定item的actionViewClass屬性來指定使用的provider類,也可以通過繼承並擴充ActionProvider類來自訂provider. Android預定義了一些provider,例如ShareActionProvider,便於開發人員實現分享功能:
此時,我們需要指定分享要用到的Intent。這裡,我們需要擷取到MenuItem並傳遞給getActionProvider()方法,從而擷取到provider。通過setShareIntent()方法設定分享所用到的Intent, 用來初始化分享action,但使用者所處的context是變化的,所以必須及時更新要分享的intent。例子如下:
這時的shareActionProvider負責處理使用者的一切互動行為,所以無需在onOptionsItemSelected()方法中處理監聽事件。預設情況下,shareActionProvider記錄了使用者選擇每個item的頻率排名,並按此排名由高到低對所有item排序。
自訂provider
我們可以通過繼承擴充ActionProvider 類來自訂provider,需要覆寫如下幾個方法:
- ActionProvider():構造方法中傳入了app的context,應存為全域變數使用。
- onCreateActionView(MenuItem):在這個方法中定義item中要顯示的view,完成初始化view和事件監聽處理等操作:
- onPerformDefaultAction():當菜單選項從overflow中被選中,系統將會調用此方法。provider應該為功能表項目提供一個預設的action。
然而,如果provider通過onPrepareSubMenu()方法提供了子功能表,那麼即使這個provider被放入了overflow中,子功能表也會被展示出來。
添加導航Tabs
在action bar上添加導航的tabs可以協助使用者方便地切換視圖,另外,這些導航tabs能很好地適配各種機型的螢幕。
首先,我們的介面上要有一個放置fragment的viewgroup,最基本的做法如下:
-
- 實現ActionBar.TabListener介面用於響應tabs的事件。
- 執行個體化需要添加的tab,並為它設定響應事件。
- 通過addTab()方法將執行個體化好的tab添加進去。
在這個例子中,當tab被點擊時,listener將對應的fragment執行個體化並加入到布局中。接下來要建立tab對象並添加進action bar中。另外,需要設定setNavigationMode(NAVIGATION_MODE_TABS),使得tabs可見。下面展示如何使用listener:
當activity停止的時候,可以記錄下當前tab所處的位置( getSelectedNavigationIndex()),這樣再次開啟activity時,就可以看到關閉時候的tab了。
我們也可以使用viewpager來管理fragment,我們只需在方法onTabSelected()中告訴viewpager當前選中了哪個fragment,這樣就可以實現手勢滑動切換view的功能了。
添加下拉導航
下拉導航通常用於放置那些必須但不是經常用到的導航項目。添加下拉導航通常需要以下步驟:
-
- 建立一個SpinnerAdapter用於提供可挑選清單項。
- 實現ActionBar.OnNavigationListener介面,監聽選擇事件。
- 在activity的onCreate()中設定setNavigationMode(NAVIGATION_MODE_LIST)來使下拉式清單可用。
- 通過setListNavigationCallbacks()方法設定下拉式清單的回呼函數:
actionBar.setListNavigationCallbacks(mSpinnerAdapter, mNavigationCallback);
SpinnerAdapter是一個介面用於為spinner提供資料。同時,Android也提供了其他可以被繼承的adapter,例如arrayadapter或simplecursoradapter。例如,通過arrayadapter建立一個使用字串數組為資料來源的adapter:
SpinnerAdapter mSpinnerAdapter =ArrayAdapter.createFromResource(this,R.array.action_list, android.R.layout.simple_spinner_dropdown_item);
ActionBar.OnNavigationListener 介面中需要實現選中項目的響應事件,下面例子將一個fragment加入到布局中:
Android之Action Bar