Action Bar在實際應用中,很好地爲用戶提供了導航,窗口位置標識,操做點擊等功能。它出現於Android3.0(API 11)以後的版本中,在2.1以後的版本中也可使用。android
添加與隱藏Action Bar 數組
在3.0以後的版本中(android:minSdkVersion 或者 android:targetSdkVersion 屬性被設置成11或者更高),默認在activity中添加了Action Bar,不用額外添加。若是不想在activity中使用Action Bar,咱們能夠經過設定activity的主題來實現。app
在程序運行過程當中,也能夠動態隱藏或者顯示Action Bar:ide
動態顯示或隱藏將引發當前的activity界面重繪。若是須要頻繁的顯示或隱藏,可使用overlay模式,將一個action bar固定在當前activity界面上方,不管顯示或隱藏都不會使activity界面重繪。函數
爲Action Bar添加Item 佈局
action bar上一般放置着最經常使用的item便於用戶進行操做,那些不重要的item會被隱藏於overflow 的item中。Item一般被預約義於menu資源文件中,以下:ui
當一個activity啓動後,在onCreateOptionsMenu()方法來填充ab中預設的item。this
在item的showAsAction屬性中,選項含義以下:spa
處理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,須要覆寫以下幾個方法:
然而,若是provider經過onPrepareSubMenu()方法提供了子菜單,那麼即便這個provider被放入了overflow中,子菜單也會被展現出來。
添加導航Tabs
在action bar上添加導航的tabs能夠幫助用戶方便地切換視圖,另外,這些導航tabs能很好地適配各類機型的屏幕。
首先,咱們的界面上要有一個放置fragment的viewgroup,最基本的作法以下:
在這個例子中,當tab被點擊時,listener將對應的fragment實例化並加入到佈局中。接下來要建立tab對象並添加進action bar中。另外,須要設置setNavigationMode(NAVIGATION_MODE_TABS),使得tabs可見。下面展現如何使用listener:
當activity中止的時候,能夠記錄下當前tab所處的位置( getSelectedNavigationIndex()),這樣再次打開activity時,就能夠看到關閉時候的tab了。
咱們也可使用viewpager來管理fragment,咱們只需在方法onTabSelected()中告訴viewpager當前選中了哪一個fragment,這樣就能夠實現手勢滑動切換view的功能了。
添加下拉導航
下拉導航一般用於放置那些必須但不是常常用到的導航項目。添加下拉導航一般須要如下步驟:
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加入到佈局中: