Skip to content

9、历史版本介绍

薛瑄 edited this page Mar 6, 2020 · 3 revisions

以下是Androidx的版本更新记录

新版本1.0.5

  • 在wechat-demo 中增加 Fragment不添加到回退栈(backstack)的代码示例
  • 更新appCompat版本 1.1.0
  • 删除@Deprecated的方法
  • 其他代码优化
  • 增加getAddedFirstFragment() 函数,用于在pop()中进行判断,防止弹出最后一个Fragment出现白屏。当前SupportFragment 并未使用

新版本1.0.4

  • 解决fragmentation的依赖问题

新版本1.0.3

  • fragment已经弹栈,但是视图依然残留在页面上 (原项目的issues #1139 #1183 #1194 #1185

  • viewpager+fragment快速滑动问题 (原项目的issues #1159

以下是Android-support版本更新记录,Androidx版本合并了最新的Android-support版本

新版本1.3有什么重要变化?

1、特性

  • 新增startWithPopTo()方法,(替代popTo(fg,boolean,runnable()-> start())新方法动画更自然,popTo()依然保留)

  • 增强出栈方法(pop()/popTo())的健壮性

2、优化

  • 对于start(),添加简单的防抖动机制

新版本1.2有什么重要变化?

1、特性

  • 新增队列机制,彻底解决Fragment多点触控、极端事务问题,提高稳定性 ( 同时新增post(Runnable)方法,可以让你的自定义任务入队)

  • 彻底解决after onSaveInstanceState()异常: 现在再也不会抛出该异常了

2、优化

  • 优化startForResult(),现在不管任何情况都可以准确回调 调用方
  • 现在默认显示 栈视图悬浮球

3、Fix

  • #683: startForResultDontHideSelf() not working

新版本1.1有什么重要变化?

1、特性

  • ExtraTransaction添加setCustomAnimations(),支持Animator(需要support-26.0.0+),更自由控制转场动画! 用法介绍见这里

  • ExtraTransaction添加startDontHideSelf(),即start()时,不hide自身Fragment

  • onSupportVisible()等生命周期调用顺序规范化:onActivityCreated() -> onResume() -> onSupportVisible -> onLazyInitView() => onSupportInvisible() -> onPause()

2、Fix

  • Fix 在SupportFragment中同时start多个Fragments时,onHiddenChanged()不回调问题 #473

  • 兼容support-27.0.+

新版本1.0有什么重要变化?

1、特性

  • 不需要强制继承SupportActivity/SupportFragment了,可以通过implements ISupportActivity/FragmentDelegate形式自己实现自定义SupportActivity/Fragment (可拷贝SupportActivity/Fragment到自己的Support里)

  • 可以通过setFragmentAnimator()动态改变Fragment的动画了

  • 支持popTo()下的动画

  • 更好的支持处理自定义tag、添加SharedElements、不加入回退栈情况下的相关事务

  • 进一步兼容多点触控、高频事务,优化过度绘制问题

2、移除

  • 移除库中的FragmentLifecycleCallbacks(自support-25.1.0开始,官方新增了FragmentLifecycleCallbacks

  • 移除replaceLoadRootFragment(),统一使用loadRootFragment()

3、新增

  • 新增SupportHelper类,该类可以帮助获取栈内Fragment的相关信息等等

  • 增加extraTransaction()处理自定义tag、添加SharedElements、不加入回退栈的相关事务(替代原transaction()

  • 新增setFragmentAnimator()动态改变Fragment动画

  • 新增loadRootFragment(containerId, fragment, addToBack, allowEnterAnim),addToback指定是否加入回退栈(默认true),allowEnterAnim指定是否允许入场动画(默认false)

  • 新增popTo(f, includeF, afterRunnable, popAnim), popAnim:指定出栈时的动画

4、Fix:

  • 通过replaceFragment()加载的Fragment生命周期可以正确触发了

新版本0.10有什么重要变化?

1、添加可全局配置的Fragmentaion Builder类

  • 提供方便打开栈视图Dialog的方法:

  • bubble: 显示悬浮球,可点击唤出栈视图Dialog,可自由拖拽

  • shake: 摇一摇唤出栈视图Dialog

  • none: 默认不显示栈视图Dialog

  • 根据是否是Debug环境,方便区别处理异常("Can not perform this action after onSaveInstanceState!")

2、Fix与调整

  • Fix v4-25.1.1在同时加载多Fragment时导致事务队列阻塞的BUG

v0.10.3:

  • Fix popToChild(fg,boolean,Runnable)层级错误问题

v0.10.4:

  • 移除Fragment中view.setClickable(true)的代码,避免穿透问题 见#249
  • 解决官方ViewPager中Fragment嵌套时,父Fragment出栈动画时,子Fragment空白问题
  • onSupportVisible()调整为在onLazyInitView()后触发

新版本0.9有什么重要变化?

1、更强的兼容性,Fix已知BUG

  • 解决多点触控问题
  • 25.1.0+的v4包,Fragment的一些机制改变了,0.9进行了startWithPop(),onEnterAnimationEnd()兼容
  • onFragmentResult()现在在任何情况都可以被正确触发了
  • Fix startWithPop()可能导致内存泄漏的问题

2、完善了SharedElement

官方在25.1.0+的v4包对add方式加载Fragment的SharedElement做了兼容,所以趁此机会对SharedElement进行了近一步的兼容,现在如果你使用25.1.0+的v4包,SharedElement在5.0+的设备可以完美工作啦!

新版本0.8有什么重要变化?

1、现在库中事务默认以commitAllowingStateLoss()方式提交

该项改变主要为了避免特殊不可控的情况下抛出的异常:Can not perform this action after onSaveInstanceState!; 提升线上版本的稳定性,“捕捉”并警告该异常,避免Crash。

2、onSupportVisible(), onSupportInvisible()

这2个方法会在Fragment可见时回调,即:只要该Fragment对用户可见时,即会被调用,包括嵌套的子Fragment

比如A内有个子FragmentB,B通过A startFragment(C) (此时A和C是同级Fragment),当你pop(C)时,A和B的onSupportVisible()都会被回调

我相信这2个方法在单AC多FG等嵌套较多的结构上,开发过程会方便很多!

3、onLazyInitView(Bundle saveInstanceState)

终于提供自有的懒加载方法了! 该方法会在 Fragment第一次对用户可见时回调(即第一次onSupportVisible()被回调时)。

`onLazyInitView()`的懒加载同时包括了 同级Fragment的懒加载情况 以及 ViewPager下的懒加载情况。

PS:onLazyInitView()onSupportVisible()等都是View安全的方法,即:在调用时可以确保onCreateView()已经被调用。

4、transaction()

现在提供了:

 supportFragment.transaction()
                .setTag(tag)
                //.addSharedElement(xx).setLaunchMode(SINGLETASK).withPop(true).forResult(1)
                .commit();
// 接着执行start()
 start(supportFragment);

在你start()或startXX()之前,你可以调用fragment的transaction()方法,该方法可以允许你设置需要start的Fragment事务条件。

例如:

  • 自定义一个Tag

  • 设置launchMode,设置是否同时关闭当前Fragment,设置SharedElement效果等等,完全可以用transaction()+start()来实现之前的各种startXX()了,甚至可以做的事情更多;

5、FragmentLifecycleCallbacks

给SupportActivity提供了类似Application的registerActivityLifecycleCallbacks(ActivityLifecycleCallbacks callback):

registerFragmentLifecycleCallbacks(FragmentLifecycleCallbacks callback){}

该方法可以监控Activity下所有Fragment的生命周期(包括support生命周期 onSupportVisible()等等)。

一些小改动

1、修正了setFragmentResult(bundle)的拼写错误问题。(原:setFramgentResult);

2、isSupportHidden()方法不再暴露给外部使用,懒加载请直接用onLazyInitView(Bundle saveInstanceState)

3、SupportActivity的onBackPressed()标记为final,不可被继承,但是可以调用,请使用onBackPressedSupport()代替;

4、添加了只有一个参数的showHideFragment(SupportFragment showFragment),库内部会帮你隐藏上一个Fragment。


新版本0.7有什么新变化?

0.7版本有一些重大变化,下面是几个重要改变:

  • 新的Demo- 添加一个仿新版知乎的新Demo,展示复杂嵌套Fragment的交互场景,强烈推荐查看。

  • 全新的Fragment恢复机制- 页面在被强杀重启后,恢复Fragment的机制进行了升级,现在可以恢复嵌套的Fragment、同级的Fragment(类似微信主页的show、hide),任何情况下都不需要担心你的Fragment会重叠了!并且总是会恢复到在被强杀前的那个Fragment!

  • 更容易的编写各种嵌套Fragment的代码- 现在你只需在Activity/Fragment中通过loadRootFragment(containerId,fragment)系列方法,装载根Fragment,那么通过该根Fragment start()的新Fragment,和根Fragment处于同一个栈层级。所以只要利用这2个方法,就可以轻松编写出复杂嵌套的Fragment代码。

  • 支持同级Fragment的处理- 添加loadMultipleRootFragment(R.id.fl_container, int showPosition, SupportFragment... fragments)方法,支持类似微信、QQ主页的Fragment形式,即show、hide形式,并且即使发生页面被强杀的情况,在恢复后库也会帮你恢复到离开前的那个Fragment,相关使用方法见这里使用场景- 同级Fragment的使用(类微信主页),也可见新Demo中的MainActivity。

  • 实验性支持SharedElement-Material过渡动画- 现在通过SupportFragment的startWithSharedElement()以及startForResultWithSharedElement()可以使用Material过渡动画,因为SharedElement仅良好支持replace(),而库中启动Fragment基本都是add(),所以目前该MD过度动画在进栈时是正常的,出栈则使用普通动画;后续继续维护...

  • 修复BUG- 1、修复onBackPressedSupport(),在0.7之前,该方法传递顺序是从上层传递到下层,难以使用和理解;现在修改为类似Android事件分发机制的onBackPressedSupport(),传递顺序从下层到上层,具体查看这里使用场景- Back键的事件传递机制; 2、修复在嵌套多层Fragment时,logFragmentStackHierarchy(TAG) log排版不正确的问题。