Android之Action Bar

  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

  1. never:永遠不會顯示。只會在溢出列表中顯示。
  2. ifRoom:會顯示在Item中,可是若是已經有4個或者4個以上的Item時會隱藏在溢出列表中。
  3. always:不管是否溢出,總會顯示。
  4. withText:Title會顯示。
  5. 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加入到佈局中:

相關文章
相關標籤/搜索