Android之Action Bar

來源:互聯網
上載者:User

標籤:

  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屬性中,選項含義如下:

  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加入到布局中:

Android之Action Bar

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.