敞开生长之旅!这是我参加「日新方案 2 月更文应战」的第 23 天,点击检查活动概况

记得前一两年很多人都跟风面向单Activity开发,顾名思义,便是整个项目只要一个Activity。一个Activity里边装着N多个Fragment,再给Fragment加上转场动画,作用和多Activity跳转无异。其实想想还比较酷,以前还需求重视多个Acitivity之间的生命周期,现在只需重视一个,但仍是需求对Fragment的生命周期进行重视。

其实早在六七年前GitHub上就有单Activity的开源库Fragmentation,后来谷歌也出了一个库Navigation。原本以为官方出品必为经典,当时跟着官方文档一步一步踩坑,最终仍是抛弃了该方案。理由大约如下:

  1. 需求创立XML文件,配置导航联系和跳转参数等
  2. 页面回退是从头创立,需求合作livedata运用
  3. 貌似还会存在卡顿,一些栈内跳转处理等问题

而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上是惯例操作。

Android:面向单Activity开发

如图,点击左面列表的单个item,右边需求显现概况,这时候再点左面的其他item,此刻的左面页面是保持不动的,但右边的概况页需求跳转对应的页面。运用过Pad的应该经常见到这种页面,比方Pad的系统设置等页面。这时只运用Activty应该是不能完结的,必须合作Fragment,左右分为两个Fragment。

但问题又呈现了,这时候点击back怎样区分部分回来和整个页面回来呢?

//整个页面回退,主要是用于当时装载了Fragment的页面回退
_mActivity.pop()
//部分回退,被装载的Fragment之间回退
pop()

如下图,这样的页面咱们又应该怎样装载呢?

Android:面向单Activity开发

能够分析,页面最外面是一个Activty,要完结单Activity其内部必装载了一个根Fragment。接着这个根Fragment中运用ViewPage和tablayout完结主页结构。当时tab页要满足右边概况页的单独跳转,还得将右边页面作为主页面,以此装载子Fragment才能完结。

Android:面向单Activity开发

总结

单Activity开发在手机和平板上运用都一样,但在平板上注意的地方更多,尤其是平板一个页面可能是多个页面组成,其部分还能单独跳转的功用,其中涉及到参数回传和栈的回退问题。运用下来,我仍是觉得某些页面临硬件要求很高的运用单Activity会呈现体验欠好的状况,有可能是优化不到位。手机运用我仍是运用多Activity方法,平板运用则运用该结构完结单Activity方法。

敞开生长之旅!这是我参加「日新方案 2 月更文应战」的第 23 天,点击检查活动概况