第十篇ANDROID的ActionBar及菜單機制–MPV模式

來源:互聯網
上載者:User

        Action Bar是ANDROID應用用到的重要開發資源之一,Action
Bar提供了一致的應用導航和視圖切換方式,也提供了突出的和容易的以可預見的方式執行重要操作的方式。

        Action Bar一般位於螢幕頂部,包括四個可操作地區:應用表徵圖或LOGO地區,用於視圖控制的Spinner下拉式功能表或TAB控制項地區,Action
button(也稱為Action Item)地區,提供溢出菜單的Action
overflow地區。

      另外Action Bar還提供與上下文選中項相關的Contextual
Action Bar、以及與功能表項目綁定的Action View以及提供
共用服務的Share
Action Provider。

          從功能上整個系統類別圖分成相對對立的三個部分,一是視圖控制部分、二是Action Provider部分、三是菜單呈現部分。

                           

                                                         圖1    ActionBar視圖控制部分

       圖1為ActionBar視圖控制部分類圖。Action Bar包括幾個顯示地區,每個地區分別由不同的檢視類型來顯示,每個檢視類型對應圖1類圖中的不同的視圖對象。

       應用表徵圖對象所在視圖對應ActionBarView對象的HomeView類型的內部視圖對象mHomeLayout,ActionBarView的OnClickListener類型的回調對象mUpClickListener提供對應用表徵圖操作的動作監聽,從而通過回調傳給實際ACTIVITY的onMenuItemSelected回呼函數,在onMenuItemSelected回呼函數中進行相應動作處理。

       用於視圖控制的Spinner下拉式功能表對應ActionBarView中的Spinner對象mSpinner(通過建立一個SpinnerAdapter對象為其提供下拉式功能表項),ActionBarView的AdapterView.OnItemSelectedListener類型的mNavItemSelectedListener是其事件的監聽對象,當選中SpinnerAdapter對象的下拉項時觸發事件,使mNavItemSelectedListener對象的onItemSelected回呼函數被調用,onItemSelected中調用ActionBar.OnNavigationListener
類型 的應用對象的onNavigationItemSelected函數進行相應事件處理。ActionBar.OnNavigationListener對象連同SpinnerAdapter對象都是通過ActionBarImpl對象的setListNavigationCallbacks(SpinnerAdapter adapter, OnNavigationListener callback)函數傳給ActionBarView對象的。為了開啟下拉式功能表功能還需要調用ActionBarImpl對象setNavigationMode函數設定NavigationMode為ActionBar.NAVIGATION_MODE_LIST模式。

       Action Button對象所在視圖對應AbsActionBarView對象的ActionMenuView類型的內部對象mMenuView。每個Action Button實際對應一個功能表項目,可以採用功能表項目一樣的方式進行處理,在具體ACTIVITY 的onCreateOptionsMenu()回調中進行菜單資源的讀取和安裝,菜單資源通過XML資源檔進行的定義。由菜單資源XML檔案中的android:showAsAction屬性定義一個功能表項目為Action
Button  Action Button的呈現由ActionMenuPresenter對象負責。

       溢出菜單和Action Button的子功能表也是在菜單資源XML檔案中進行定義,當在菜單XML資源檔中定義Action
Buttonandroid:showAsAction屬性定義為"ifRoom"時,當活動條沒有足夠空間時Action Button顯示到溢出菜單所在空間。溢出菜單的呈現由派生自MenuPopupHelper對象的OverflowPopup負責,Action Button的子功能表由派生自MenuPopupHelper對象的ActionButtonSubmenu負責呈現。

          Contextual Action Bar對應ActionBarContextView類,ActionBarContextView視圖由ActionBarImpl對象的startActionMode函數通過調用其initForMode函數進行初始化(以ActionModeImpl對象作為參數 ) ,ActionBarContextView視圖的菜單採用ActionModeImpl對象的菜單,ActionModeImpl對象的菜單的產生及功能表項目的事件處理都通過ActionModeImpl對象的ActionMode.Callback類型的回調對象處理,ActionBarContextView菜單的呈現也是由ActionBarContextView對象建立的相應的ActionMenuPresenter對象負責

         ActionMode.Callback類型的回調對象通過startActionMode函數的參數傳給ActionModeImpl對象,ActionMode.Callback類型的回調對象是使用者為特定上下文視圖定義的。因此使用者為了使特定視圖有上下文Action Bar,需要如下兩部工作:

        1 實現ActionMode.Callback回調介面,在ActionMode.Callback回呼函數中產生相應菜單及完成功能表項目的事件處理代碼。

        2 調用startActionMode(ActionMode.Callback callback)來顯示上下文Action Bar。

         Action View對象對應ActionBarView對象中的mExpandedActionView,由ExpandedActionViewMenuPresenter對象負責呈現,每個Action View對象與功能表項目進行綁定,在菜單資源XML檔案中進行描述,由XML檔案中的android:actionLayout
android:actionViewClass 屬性確定。

        TAB 控制群組對應對象ActionBarImpl中的TabImpl對象組,在ScrollingTabContainerView視圖中顯示,為了開啟TAB導航模式,需要調用ActionBarImpl對象setNavigationMode函數設定NavigationMode為ActionBar.NAVIGATION_MODE_TABS。TabImpl對象、ActionBarImpl對象、ScrollingTabContainerView視圖三者構成MVC模式關係,TabImpl對象對應Model,
ActionBarImpl對象對於控制器,ScrollingTabContainerView對應視圖 。

        類圖中的 ActionBarImpl提供對各個視圖的控制功能。

    Action Provider元素機制與Action View差不多,和Action View一樣需要與功能表項目綁定,也是在菜單資源的XML檔案中為功能表項目指定綁定的Action Provider對象 ,由XML檔案中的android:actionProviderClass屬性確定,只是Action
Provider更複雜,包括更多的對象,而Action View只對應一個視圖對象。使用者在使用Action Provider時,需要建立派生自ActionProvider的
具體ActionProvider類,並酌情實現ActionProvider的相應回調介面,尤其在具體ActionProvider類的onCreateActionView回呼函數中需要建立相應的視圖,具體ActionProvider類可以具有獨立的布局XML檔案,在onCreateActionView回調中進行讀取來產生相應視圖。

                    

                                                圖2 ActionBar菜單呈現部分

     圖2
Action Bar相關視圖對象的菜單呈現及菜單構建相關類圖。

     Action Bar相關視圖的菜單呈現及菜單構建類圖包括負責菜單構建過程的菜單構建對象(MenuBuilder)、負責菜單容器及功能表項目的視圖建立的菜單呈現對象(MenuPresenter)、菜單容器和功能表項目視圖對象(
view)三類對象構成,三類對象構成MVP模式。

         MenuBuilder對應MVP模式的model,MenuPresenter對應MVP模式的Presenter,視圖對象對應View。
MenuBuilder構建菜單的每一功能表項目。
MenuPresenter從MenuBuilder對象讀取功能表項目並產生相應的功能表項目子視圖,建立的功能表項目子視圖被添加到菜單[內容] 檢視中,MenuPresenter也提供對MenuBuilder對象及其功能表項目的擷取及其它操作。視圖通過MenuPresenter獲得和操作菜單和功能表項目對應的視圖,在MVP模式中視圖和模式不直接互動。

       ActionBar系統包括四個MenuPresenter具體類,ActionMenuPresenter負責Action  Button及Contextual Action
Bar對應的菜單視圖呈現,ExpandedActionViewMenuPresenter負責與功能表項目綁定的Action View對象的視圖呈現,OverflowPopup負責
溢出菜單對應的視圖呈現,ActionButtonSubmenu負責子功能表對應的視圖呈現。OverflowPopup和ActionButtonSubmenu都派生自MenuPopupHelper,由於OverflowPopup呈現的菜單為MenuBuilder對象,而ActionButtonSubmenu呈現的菜單對應SubMenuBuilder對象,因此MenuPopupHelper採用的MenuBuilder對象是一個配接器物件,採用了適配器模式對不同對象封裝成相同的介面。

       圖2 類圖中MenuItemImpl類是對應功能表項目的具體實作類別。MenuBuilder對象建立的每一個MenuItemImpl類型的功能表項目放在MenuBuilder對象的的數組中。

       MenuPopupHelper對象也登記為anchor視圖的監聽器,通過ViewTreeObserver對象來檢測菜單所在anchor視圖的變化。對於溢出菜單的anchor視圖為OverflowMenuButton。

             

                                   
圖3  action provider提供部分

      圖3
是系統提供的ShareActionProvider類及相關對象,提供快速存取提供
共用服務的Action。

         整個類圖主要包括ShareActionProvider、ActivityChooserModel、ActivityChooserView、ActivityChooserViewAdapter等對象。

        派生自ActionProvider的具體類ShareActionProvider,用來執行個體化ActivityChooserModel、ActivityChooserView對象,並為ActivityChooserView對象設定資料模式,產生視圖,操作和擷取Model資訊,根據Model資訊建立活動菜單。

           ActivityChooserModel、ActivityChooserView、ActivityChooserViewAdapter三者構成MVC模式,分別對應Model、View及採用Adapter模式的Control,ActivityChooserView通過ActivityChooserViewAdapter擷取ActivityChooserModel中的活動資訊,ActivityChooserModel本身派生自DataSetObservable,可以在ActivityChooserView對象中為ActivityChooserModel對象登記一個DataSetObserver類型的對象,ActivityChooserModel對象通過該對象向ActivityChooserView對象發送ActivityChooserModel對象中的資料變化通知。

            ActivityChooserModel對於通過intent從包管理器中獲得的符合intent條件的活動記錄(以ActivityResolveInfo類型儲存在數組列表中mActivites)的排序方法採用了策略模式,排序方法被封裝成對象,在沒有通過setActivitySorter方法設定排序方法時,採用預設排序方法,由DefaultSorter對象封裝。DefaultSorter對象提供的排序方法是依據活動記錄中的weight值進行排序,被排序的活動記錄的weight值還依據記錄在HistoricalRecord(HistoricalRecord中的活動通過讀私人的XML類型的共用曆史檔案獲得)列表中的活動順序進行修改,依據HistoricalRecord列表的從後往前的順序為mActivites數組中對應的對象增加weight值,活動記錄中越往後的記錄在mActivites列表中對應活動增加的權值越小,最新的相應記錄增加的權值越大。

           HistoryPersister線程對象用於把HistoricalRecord列表中的記錄儲存到曆史檔案中。HistoryLoader線程對象用於讀取曆史檔案到HistoricalRecord列表中。DataModelPackageMonitor對象用於監視資料包,在資料封裝更新時同步活動記錄列表mActivites。ActivityChooserMode對象還通過Map<String,
ActivityChooserModel>類型的HashMap保證一個相同的曆史檔案只能執行個體化一個ActivityChooserModel對象,是單例模式的具體應用。

                                                                     歡迎轉載,轉載時請尊重原創註明出處。

 

 

   

   

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.