2013年9月1日星期日

ActionBar+Fragment

项目中经常会使用Tab方式进行导航、页面切换,以前采用了自定义Tab加Fragment的方式实现,但是实际项目应用中发现了几个问题:
  • 自定义Tab比较繁琐,Tab位置固定,不能在横竖屏切换的时候进行适当调整
  • 每个Tab页作为一个Fragment,Frament内部的View切换/后退必须要自己管理
  • Fragment相互切换时采用hide/show方式才能保持页面状态,这样可能会造成内存紧张
新的解决方案:
  • ActionBar是在android 3.0版本中出现的,放在屏幕上方,可以在上面设置标题、logo、添加MenuItem、添加Tab、也可以添加自定义的View,而且在横竖屏切换的时候会自动调整Tab的位置,通过在Activity中设置android:uiOptions=”splitActionBarWhenNarrow” 当纵向ActionBar空间不足时会自动将MenuItem分开放到屏幕下方。所以这里用ActionBar的Tab代替自定义的Tab
  • 在android 4.2版本中Fragment进行了改进(通过support包可以兼容到2.3),Fragment中可以嵌套子Fragment。这样就可以很方便的通过Fragment的stack来管理后退顺序问题。这里利用Fragment嵌套来代替以前的View
实现效果:
横屏首页
竖屏首页
竖屏栈测试
竖屏栈测试点击进入下层fragment(切换后Tab后,状态不变)
实现思路:
代码实现:
引入android-support-v4.jar。由于ActionBar并没有在补充的support包中,所以最低只能兼容到3.0版本。
FragmentActivity实现,主要是ActionBar的初始化、最外层ParentFragment初始化以及Tab切换事件:

接下来要进行最外层父Fragment的实现,这里让所有的Fragment继承GlobalFragment (它继承自Fragment),这样方便Fragment公共内容的管理,比如后退事件管理,甚至在项目后期加入数据统计的sdk。只需要在GlobalFragment 中实现就可以了,节省和很多工作量而且方便管理。
先看GlobalFragment,代码很简单,一个空的OnBackPressed方法,目的是将FragmentActivity中的后退事件分发到外层Fragment,因为外层Fragment中的子Fragment是响应不到系统OnBackPressed事件的。
下面看“栈测试”标签的外层FragmentStackFragment,主要要注意的地方是这里的FragmentManager 是 ChildFragmentManager、还有saveInstanceState的使用,以及OnBackPressed的重写来管理子Fragment后退
第一个子Fragment,HomePageFragment1。在这里得到的FragmentManager其实就是上面的父Fragment -FragmentStackFragment中的getChildFragmentManager。在这个页面通过点击”进入下一层”按钮切换Fragment到HomePageFragment2
最后来看HomePageFragment2


没有评论:

发表评论