【转】ANDROID的ActionBar及菜单机制

1345890805_4612.jpg
图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 Button的android: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回调中进行读取来生成相应视图。


1345890819_4142.jpg
图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。


1345890824_1273.jpg
图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类型的HashMap保证一个相同的历史文件只能实例化一个ActivityChooserModel对象,是单例模式的具体应用。

 

转载自:http://www.apkbus.com/forum.php?mod=viewthread&tid=69132

转载于:https://www.cnblogs.com/jeriffe/articles/2737403.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值