敞开生长之旅!这是我参加「日新方案 2 月更文应战」的第 23 天,点击检查活动概况
记得前一两年很多人都跟风面向单Activity开发,顾名思义,便是整个项目只要一个Activity。一个Activity里边装着N多个Fragment,再给Fragment加上转场动画,作用和多Activity跳转无异。其实想想还比较酷,以前还需求重视多个Acitivity之间的生命周期,现在只需重视一个,但仍是需求对Fragment的生命周期进行重视。
其实早在六七年前GitHub上就有单Activity的开源库Fragmentation,后来谷歌也出了一个库Navigation。原本以为官方出品必为经典,当时跟着官方文档一步一步踩坑,最终仍是抛弃了该方案。理由大约如下:
- 需求创立XML文件,配置导航联系和跳转参数等
- 页面回退是从头创立,需求合作livedata运用
- 貌似还会存在卡顿,一些栈内跳转处理等问题
而Github上Fragmentation库已经中止保护,所幸的是再lssuse中发现了一个根据它持续保护的SFragmentation,所以正是敞开了面向单Activity的开发。
提供了可滑动回来的版本
dependencies {
//请运用最新版本
implementation 'com.github.weikaiyun.SFragmentation:fragmentation:latest'
//滑动回来,可选
implementation 'com.github.weikaiyun.SFragmentation:fragmentation_swipeback:latest'
}
由所以Fragment之间的跳转,咱们需求将原有的Activity跳转动画在结构初始化时设置到该结构中
Fragmentation.builder()
//设置 栈视图 形式为 (默认)悬浮球形式 SHAKE: 摇一摇唤出 NONE:躲藏, 仅在Debug环境生效
.stackViewMode(Fragmentation.BUBBLE)
.debug(BuildConfig.DEBUG)
.animation(
R.anim.public_translate_right_to_center, //进入动画
R.anim.public_translate_center_to_left, //躲藏动画
R.anim.public_translate_left_to_center, //从头呈现时的动画
R.anim.public_translate_center_to_right //退出动画
)
.install()
因为只要一个Activity,所以需求在这个Activity中装载根Fragment
loadRootFragment(int containerId, SupportFragment toFragment)
但现在的APP几乎都是一个页面多个Tab组成的怎样办呢?
loadMultipleRootFragment(int containerId, int showPosition, SupportFragment... toFragments);
有了多个Fragment的显现,咱们需求切换Tab实践也很简单
showHideFragment(ISupportFragment showFragment);
是不是运用起来很简单,主页咱们处理了,关于跳转和回来、参数的承受和传递呢?
//发动目标fragment
start(SupportFragment fragment)
//带回来的发动方法
startForResult(SupportFragment fragment,int requestCode)
//接收回来参数
override fun onFragmentResult(requestCode: Int, resultCode: Int, data: Bundle?) {
super.onFragmentResult(requestCode, resultCode, data)
}
//回来到上个页面,和activity的back()类似
pop()
关于单Activity而言,咱们其实也能够注册一个大局的Fragment监听,这样就能掌控当时的Fragmnet
supportFragmentManager.registerFragmentLifecycleCallbacks(
object : FragmentManager.FragmentLifecycleCallbacks() {
override fun onFragmentAttached(fm: FragmentManager, f: Fragment, context: Context) {
super.onFragmentAttached(fm, f, context)
}
override fun onFragmentCreated(
fm: FragmentManager,
f: Fragment,
savedInstanceState: Bundle?
) {
super.onFragmentCreated(fm, f, savedInstanceState)
}
override fun onFragmentStarted(fm: FragmentManager, f: Fragment) {
super.onFragmentStarted(fm, f)
}
override fun onFragmentResumed(fm: FragmentManager, f: Fragment) {
super.onFragmentResumed(fm, f)
}
override fun onFragmentDestroyed(fm: FragmentManager, f: Fragment) {
super.onFragmentDestroyed(fm, f)
}
},
true
)
接下来咱们看看Pad运用。关于手机运用来说,一般不会存在部分页面跳转的状况,可是Pad上是惯例操作。
如图,点击左面列表的单个item,右边需求显现概况,这时候再点左面的其他item,此刻的左面页面是保持不动的,但右边的概况页需求跳转对应的页面。运用过Pad的应该经常见到这种页面,比方Pad的系统设置等页面。这时只运用Activty应该是不能完结的,必须合作Fragment,左右分为两个Fragment。
但问题又呈现了,这时候点击back怎样区分部分回来和整个页面回来呢?
//整个页面回退,主要是用于当时装载了Fragment的页面回退
_mActivity.pop()
//部分回退,被装载的Fragment之间回退
pop()
如下图,这样的页面咱们又应该怎样装载呢?
能够分析,页面最外面是一个Activty,要完结单Activity其内部必装载了一个根Fragment。接着这个根Fragment中运用ViewPage和tablayout完结主页结构。当时tab页要满足右边概况页的单独跳转,还得将右边页面作为主页面,以此装载子Fragment才能完结。
总结
单Activity开发在手机和平板上运用都一样,但在平板上注意的地方更多,尤其是平板一个页面可能是多个页面组成,其部分还能单独跳转的功用,其中涉及到参数回传和栈的回退问题。运用下来,我仍是觉得某些页面临硬件要求很高的运用单Activity会呈现体验欠好的状况,有可能是优化不到位。手机运用我仍是运用多Activity方法,平板运用则运用该结构完结单Activity方法。
敞开生长之旅!这是我参加「日新方案 2 月更文应战」的第 23 天,点击检查活动概况