Google 致力于为黑人社区推动种族平等。查看具体举措

Fragment

上次更新时间 当前稳定版 下一候选版本 Beta 版 Alpha 版
2020 年 1 月 22 日 1.2.0 - - -

声明依赖项

要添加 Fragment 的依赖项,您必须将 Google Maven 代码库添加到项目中。请阅读 Google 的 Maven 代码库了解详情。

在应用或模块的 build.gradle 文件中添加所需工件的依赖项:

dependencies {
    def fragment_version = "1.2.5"

    // Java language implementation
    implementation "androidx.fragment:fragment:$fragment_version"
    // Kotlin
    implementation "androidx.fragment:fragment-ktx:$fragment_version"
    // Testing Fragments in Isolation
    debugImplementation "androidx.fragment:fragment-testing:$fragment_version"
}

如需详细了解依赖项,请参阅添加编译依赖项

版本 1.2.0

版本 1.2.0

2020 年 1 月 22 日

发布了 androidx.fragment:fragment:1.2.0androidx.fragment:fragment-ktx:1.2.0androidx.fragment:fragment-testing:1.2.0版本 1.2.0 中包含以下提交内容

自 1.1.0 以来的重要变更

  • FragmentContainerView:我们强烈建议使用 FragmentContainerView 容器来存储动态添加的 Fragment,而不要使用 FrameLayout 或其他布局。FragmentContainerView 同样支持 classandroid:name 和可选的 android:tag(这与 <fragment> 标记相同),但会使用常规的 FragmentTransaction 来添加此初始 Fragment,而不会添加 <fragment> 使用的自定义代码路径。
  • onDestroyView() 调用时机:Fragment 现在会等到退出动画、退出框架转换和退出 AndroidX 转换(使用 Transition 1.3.0 时)完成后再调用 onDestroyView()
  • 基于类的 add()replace():在 FragmentTransaction 中添加了 add()replace() 的新重载,这些重载采用 Class<? extends Fragment>Bundle(可选)参数。这些方法使用您的 FragmentFactory 来构造要添加的 Fragment 的实例。此外,还向 fragment-ktx 中添加了使用具体化类型(例如 fragmentTransaction.replace<YourFragment>(R.id.container))的 Kotlin 扩展程序。
  • Lifecycle ViewModel SavedState 集成:现在将 by viewModels()by activityViewModels()ViewModelProvider 构造函数或 ViewModelProviders.of() 与 Fragment 一起使用时,会使用 SavedStateViewModelFactory 作为默认出厂设置。
  • 新的 Lint 检查:添加了新的 Lint 检查,以确保您在从 onCreateView()onViewCreated()onActivityCreated() 观察 LiveData 时使用 getViewLifecycleOwner()
  • 弃用 getFragmentManager():弃用了关于 Fragment 的 getFragmentManager()requireFragmentManager() 方法,并替换为单个 getParentFragmentManager() 方法,后者会返回添加了 Fragment 的非 null FragmentManager(您可以使用 isAdded() 来确定是否可以安全调用该方法)。
  • 弃用 FragmentManager.enableDebugLogging():弃用了静态 FragmentManager.enableDebugLogging 方法。FragmentManager 现在遵循 FragmentManager 标记的 Log.isLoggable(),以允许您启用 DEBUGVERBOSE 日志记录,而无需重新编译应用。

已知问题

  • ProGuard 不会自动保留仅通过 FragmentContainerView 上的 classandroid:name 属性引用的 Fragment,需要您为每个 Fragment 类手动添加保留规则。(b/142601969)
  • 通过 FragmentContainerView 使用 classandroid:name 在 XML 文件中添加 NavHostFragment 时,您无法在 Activity 的 onCreate() 中使用 findNavController()。(b/142847973)

版本 1.2.0-rc05

2020 年 1 月 8 日

发布了 androidx.fragment:fragment:1.2.0-rc05androidx.fragment:fragment-ktx:1.2.0-rc05androidx.fragment:fragment-testing:1.2.0-rc05版本 1.2.0-rc05 中包含以下提交内容

问题修复

  • 修复了使用 <fragment> 标记时 Fragment 1.2.0-rc04 中出现的回归问题,此问题会导致在 Activity 销毁期间错误地调用 onViewCreated()。(b/146290333)
  • 现在可以正确清除通过 <fragment> 标记添加的 Fragment 的“非配置”状态,即便这些 Fragment 只是偶尔出现在布局中(即仅出现在横向布局中)也不例外。因此,现在可以正确地将这些 Fragment 变为 CREATED 状态(即使它们不在您的布局中),而不是进行实例化,但绝不会对这些 Fragment 调用任何生命周期方法。(b/145769287)

版本 1.2.0-rc04

2019 年 12 月 18 日

发布了 androidx.fragment:fragment:1.2.0-rc04androidx.fragment:fragment-ktx:1.2.0-rc04androidx.fragment:fragment-testing:1.2.0-rc04版本 1.2.0-rc04 中包含以下提交内容

问题修复

  • 调整了 TRANSIT_FRAGMENT_OPENTRANSIT_FRAGMENT_CLOSETRANSIT_FRAGMENT_FADE 的动画以避免出现视觉问题。(b/145468417)

版本 1.2.0-rc03

2019 年 12 月 4 日

发布了 androidx.fragment:fragment:1.2.0-rc03androidx.fragment:fragment-ktx:1.2.0-rc03androidx.fragment:fragment-testing:1.2.0-rc03版本 1.2.0-rc03 中包含以下提交内容

问题修复

  • 修复了以下意外行为变更:当已被移除的 Fragment 的退出动画/转换运行时,findFragmentById()/findFragmentByTag() 仍会返回这些 Fragment。(b/143982969aosp/1167585
  • 现在,当包含的 Activity 调用 onSaveInstanceState() 时,子级 Fragment 会在其父级之前正确停止。(b/144380645)
  • 修复了在弹出隐藏的 Fragment 后,View 会被错误地标记为 INVISIBLE 的问题。(b/70793925)
  • 共享 Fragment 元素转换现在可以处理已经过旋转、调整等的 View (b/142835261)

文档更新

  • 澄清了关于 setUserVisibleHint() 的弃用文档。(b/143897055)
  • 改进了关于 setFragmentFactory()getFragmentFactory() 的说明文档,更清楚地说明了设置 FragmentFactory 也会影响子级 FragmentManager 的问题。(aosp/1170095)

依赖项变更

  • Fragment 现在依赖于 Lifecycle 2.2.0-rc03、Lifecycle ViewModel SavedState 1.0.0-rc03 和 Activity 1.1.0-rc03

版本 1.2.0-rc02

2019 年 11 月 7 日

发布了 androidx.fragment:fragment:1.2.0-rc02androidx.fragment:fragment-ktx:1.2.0-rc02androidx.fragment:fragment-testing:1.2.0-rc02版本 1.2.0-rc02 中包含这些提交内容

问题修复

  • 在 Kotlin 中,从 onCreateView()onViewCreated()onActivityCreated() 中观察 LiveData 时使用 getViewLifecycleOwner() 的 LintFix(在 Fragment 1.2.0-rc01 中引入)现在使用 Kotlin 属性访问语法 viewLifecycleOwner 而不是 getViewLifecycleOwner()。(aosp/1143821)

版本 1.2.0-rc01

2019 年 10 月 23 日

发布了 androidx.fragment:fragment:1.2.0-rc01androidx.fragment:fragment-ktx:1.2.0-rc01androidx.fragment:fragment-testing:1.2.0-rc01版本 1.2.0-rc01 中包含这些提交内容

新功能

  • 现在除了 android:name 之外,FragmentContainerView 还支持 class 属性,体现了 <fragment> 标记的功能。(b/142722242)
  • 添加了新的 Lint 检查,以确保您从 onCreateView()onViewCreated()onActivityCreated() 中观察 LiveData 时使用 getViewLifecycleOwner()。(b/137122478)

问题修复

  • 现在对 DialogFragmentonDismissonCancel 回调可确保传递给它们的 DialogInterface 为非 null 值,并且 getDialog() 在执行时返回非 null 值。(b/141974033)
  • FragmentContainerView 在膨胀过程中现在会添加由 classandroid:name 指定的 Fragment,以确保 findFragmentById()findFragmentByTag() 之后立即生效。(b/142520327)
  • 修复了由于保存状态而导致的 FragmentContainerView 中的 IllegalStateException。(b/142580713)
  • 修复了混淆 FragmentContainerView 类时导致的 FragmentContainerView 中的 UnsupportedOperationException。(b/142657034)

已知问题

  • ProGuard 不会自动保留仅通过 FragmentContainerView 上的 classandroid:name 属性引用的 Fragment,需要您为每个 Fragment 类手动添加保留规则。我们已停用建议移至 FragmentContainerView 的 Lint 规则,直到通过 aapt2 解决此问题。(b/142601969)

版本 1.2.0-beta02

2019 年 10 月 11 日

发布了 androidx.fragment:fragment:1.2.0-beta02androidx.fragment:fragment-ktx:1.2.0-beta02androidx.fragment:fragment-testing:1.2.0-beta02版本 1.2.0-beta02 中包含这些提交内容

问题修复

  • 修复了 Fragment 的 onInflate() 无法从 FragmentContainerView 接收适当属性的问题(导致 NavHostFragment 等情况出错)。(b/142421837)

版本 1.2.0-beta01

2019 年 10 月 9 日

发布了 androidx.fragment:fragment:1.2.0-beta01androidx.fragment:fragment-ktx:1.2.0-beta01androidx.fragment:fragment-testing:1.2.0-beta01版本 1.2.0-beta01 中包含这些提交内容

新功能

  • FragmentContainerView 新增了对添加初始 Fragment 的支持,并新增了对 android:name 和可选 android:tag XML 属性的支持。与 <fragment> 标记不同,FragmentContainerView 在后台使用常规 FragmentTransaction 来添加初始 Fragment,允许对 FragmentContainerView 执行进一步的 FragmentTransaction 操作,并允许对布局使用视图绑定。(b/139830628b/141177981
  • Fragment 现在包含 Lint 警告,提供了将 <fragment> 替换为 FragmentContainerView 的快速修复。(b/139830056)

问题修复

  • 修复了使用 androidx.transition 时出现的 ClassCastException。(b/140680619)
  • 使用 Transition 1.3.0-beta01 时,Fragment 现在会等待 androidx.transition 转换(还有框架转换和动画,它们分别在 Fragment 1.2.0-alpha03Fragment 1.2.0-alpha02 中进行了修复)完成,然后再分派 onDestroyView()。(aosp/1119841)
  • 使用 Transition 1.3.0-beta01 时,Fragment 现在可以正确取消 androidx.transition 转换,然后再在同一个容器上开始新的转换/动画。(aosp/1119841)
  • 修复了 API 17 及更低级别中在使用 FragmentContainerView 的情况下对 Fragment 的根视图使用 androidx.transition 转换时出现的问题。(b/140361893)
  • fragment-testing 工件现在依赖于 AndroidX Test 1.2.0,修复了与最新 Espresso 3.2.0 不兼容的问题。(b/139100149)
  • 移除了 FragmentManager 中对 Log.w 的使用。(aosp/1126468)

已知问题

  • Fragment 的 onInflate() 不会从 FragmentContainerView 接收适当属性,导致 NavHostFragment 等情况出错。(b/142421837)

版本 1.2.0-alpha04

2019 年 9 月 18 日

发布了 androidx.fragment:fragment:1.2.0-alpha04androidx.fragment-ktx:example:1.2.0-alpha04androidx.fragment:fragment-testing:1.2.0-alpha04版本 1.2.0-alpha04 中包含这些提交内容

API 变更

  • Fragment 上的 getFragmentManager()requireFragmentManager() 方法已弃用,并替换为单个 getParentFragmentManager() 方法,后者会返回添加了 Fragment 的非 null FragmentManager(您可以使用 isAdded() 确定是否可以安全调用)。(b/140574496)
  • 已弃用静态 FragmentManager.enableDebugLogging 方法。FragmentManager 现在遵守标记 FragmentManagerLog.isLoggable(),允许您启用 DEBUGVERBOSE 日志记录,而无需重新编译应用。(aosp/1116591)

问题修复

  • 现在,当一些 Fragment 上的退出动画正在运行时,系统会正确销毁其他 Fragment。(b/140574199)
  • 修复了 Fragment 之前不会而现在会调用 Activity.findViewById() 的问题。(aosp/1116431)

版本 1.2.0-alpha03

2019 年 9 月 5 日

发布了 androidx.fragment:fragment:1.2.0-alpha03androidx.fragment:fragment-ktx:1.2.0-alpha03androidx.fragment:fragment-testing:1.2.0-alpha03。点击此处可查看此版本中包含的提交内容。

API 变更

问题修复

  • FragmentContainerView 现在能够在从返回堆栈弹出 Fragment 时正确地逆转绘图顺序。(b/139104187)
  • 修复了同时弹出 Fragment 和添加新的 Fragment 时运行错误动画的问题。(b/111659726)
  • Fragment 现在会等待转换(还有动画,它已在 Fragment 1.2.0-alpha02 中进行了修复)完成,然后再分派 onDestroyView()。(b/138741697)

版本 1.2.0-alpha02

2019 年 8 月 7 日

发布了 androidx.fragment:fragment:1.2.0-alpha02androidx.fragment:fragment-ktx:1.2.0-alpha02androidx.fragment:fragment-testing:11.2.0-alpha02。点击此处可查看此版本中包含的提交内容。

新功能

  • SavedStateViewModelFactory 现在是将 by viewModels()by activityViewModels()ViewModelProvider 构造函数或 ViewModelProviders.of()Fragment 一起使用时所用的默认出厂设置。(b/135716331)
  • 更新了将 TRANSIT_FRAGMENT_OPENTRANSIT_FRAGMENT_CLOSETRANSIT_FRAGMENT_FADEFragmentTransaction 上的 setTransition 一起使用时的默认动画,以匹配 Android Q 设备上的 Activity 使用的动画。(aosp/1012812aosp/1014730

API 变更

  • 引入了 FragmentContainerView 作为强烈推荐用于容纳动态添加的 Fragment 的容器,可替代使用 FrameLayout 等,因为它解决了动画 z 排序问题以及分派给 Fragment 的窗口边衬区的问题。(b/37036000aosp/985243b/136494650
  • 添加了静态 FragmentManager.findFragment(View) 方法,用于从由 Fragment 扩充的视图中检索包含的 Fragment。还可以使用 fragment-ktx 中的 Kotlin 扩展程序。(aosp/1090757)
  • FragmentTransaction 上添加了新的 add()replace() 过载,这些过载采用 Class<? extends Fragment> 和可选的参数 Bundle。这些方法使用 FragmentFactory 来构造要添加的 Fragment 实例。使用具体化类型(例如,fragmentTransaction.replace<YourFragment>(R.id.container))的 Kotlin 扩展程序也已添加至 fragment-ktx。(b/126124987)
  • @MainThread 注释已添加至 Fragment 生命周期回调中。(b/127272564)
  • 已弃用 FragmentTransactionFragmentManager.BackStackEntry 上的面包屑导航标题相关 API。(b/138252944)
  • 已弃用 FragmentTransaction 上的 setTransitionStyle 方法。(aosp/1011537)
  • FragmentManager 中的许多方法已不再是 abstractFragmentManager 本身仍然是 abstract,并且不应直接对其进行实例化或扩展;您应该继续仅从 getSupportFragmentManager()getChildFragmentManager() 等中获取现有实例。

问题修复

  • Fragment 1.1.0-rc04 开始:Fragment 现在可以正确取消对已弹出 Fragment 的推迟转换。(b/138251858)
  • Fragment 1.1.0-rc03 开始:修复了多次调用设有超时的 postponeEnterTransition() 时无法取消以前的超时这一问题。(b/137797118)
  • Fragment 1.1.0-rc02 开始:修复了移除当前项时 FragmentPagerAdapterFragmentStatePagerAdapter 中出现崩溃的问题。(b/137209870)
  • Fragment 现在会等待动画结束,然后再分派 onDestroyView()。(b/136110528)
  • 现在,在为父级 Fragment 设置动画效果时可以正确处理来自子级 Fragment 及其子项的 Fragment 动画。(b/116675313)
  • 修复了使用共享元素转换以及组合弹出和添加操作时出现的 NullPointerException 问题。(b/120507394)
  • 针对在 Robolectric 测试中使用 FragmentPagerAdapterFragmentStatePagerAdapter 时出现的 IllegalStateException 添加了解决办法。(b/137201343)

版本 1.2.0-alpha01

2019 年 7 月 2 日

发布了 androidx.fragment:fragment:1.2.0-alpha01androidx.fragment:fragment-ktx:1.2.0-alpha01androidx.fragment:fragment-testing:1.2.0-alpha01。点击此处可查看此版本中包含的提交内容。

新功能

  • FragmentManager 现在可以在附加 Fragment 的视图之后、调用 onViewCreated() 之前直接调用 requestApplyInsets(),以确保您的视图始终具有正确的边衬区。(b/135945162)

问题修复

  • 修复了在 replace() 之前弹出使用过 setPrimaryNavigationFragment()FragmentTransaction 时出现的 NullPointerException 问题。(b/134673465)

版本 1.1.0

版本 1.1.0

2019 年 9 月 5 日

发布了 androidx.fragment:fragment:1.1.0androidx.fragment:fragment-ktx:1.1.0androidx.fragment:fragment-testing:1.1.0。点击此处可查看此版本中包含的提交内容。

自 1.0.0 以来的重要变更

  • fragment-testingfragment-testing 工件提供了一个 FragmentScenario 类,用于单独测试 Fragment。如需了解详情,请参阅“测试应用的 Fragment”文档
  • FragmentFactory:您现在可以在 FragmentManager 上设置一个 FragmentFactory,以管理 Fragment 实例的创建,从而消除必须具有无参数构造函数这一严格要求。
  • 适用于 ViewModel 的 Kotlin 属性委托fragment-ktx 工件现在包含两个 Kotlin 属性委托:用于访问与单个 Fragment 相关联的 ViewModel 的 by viewModels(),以及用于访问范围限定为 Activity 的 ViewModel 的 by activityViewModels()
  • 最大生命周期:您现在可以通过对 FragmentTransaction 调用 setMaxLifecycle() 来为 Fragment 设置最大生命周期状态。这将替换现已弃用的 setUserVisibleHint()FragmentPagerAdapterFragmentStatePagerAdapter 具有新的构造函数,允许您转换为新的行为。
  • FragmentActivity LayoutId 构造函数FragmentActivity 的子类现在可以选择性地对 FragmentActivity 调用采用 R.layout ID 的构造函数,以指明应设置为内容视图的布局,作为调用 onCreate() 中的 setContentView() 的替代方法。这不会改变您的子类必须具有无参构造函数的要求。
  • Fragment LayoutId 构造函数Fragment 的子类现在可以选择性地对 Fragment 调用采用 R.layout ID 的构造函数,以指明应用于此 Fragment 的布局,作为替换 onCreateView() 的替代方法。可以在 onViewCreated() 中配置扩充后的布局。
  • 通过设置超时来推迟:添加了采用超时的新 postponeEnterTransition() 过载。

版本 1.1.0-rc04

2019 年 8 月 7 日

发布了 androidx.fragment:fragment:1.1.0-rc04androidx.fragment:fragment-ktx:1.1.0-rc04androidx.fragment:fragment-testing:1.1.0-rc04。点击此处可查看此版本中包含的提交内容。

问题修复

  • Fragment 现在可以正确取消对已弹出 Fragment 的推迟转换。(b/138251858)

版本 1.1.0-rc03

2019 年 7 月 19 日

发布了 androidx.fragment:fragment:1.1.0-rc03androidx.fragment:fragment-ktx:1.1.0-rc03androidx.fragment:fragment-testing:1.1.0-rc03。点击此处可查看此版本中包含的提交内容。

问题修复

  • 修复了多次调用设有超时的 postponeEnterTransition() 时没法取消以前的超时这一问题。(b/137797118)

版本 1.1.0-rc02

2019 年 7 月 17 日

发布了 androidx.fragment:fragment:1.1.0-rc02androidx.fragment:fragment-ktx:1.1.0-rc02androidx.fragment-testing:fragment:1.1.0-rc02。点击此处可查看此版本中包含的提交。

问题修复

  • 修复了移除当前项时 FragmentPagerAdapterFragmentStatePagerAdapter 中出现崩溃的问题。(b/137209870)

版本 1.1.0-rc01

2019 年 7 月 2 日

发布了 androidx.fragment:fragment:1.1.0-rc01androidx.fragment:fragment-ktx:1.1.0-rc01androidx.fragment:fragment-testing:1.1.0-rc01。点击此处可查看此版本中包含的提交。

问题修复

  • 在转换运行时,Fragment 现在可以正确地更新使用 show()hide() 操作时的可见性。(b/133385058)
  • 修复了在 replace() 之前弹出使用过 setPrimaryNavigationFragment()FragmentTransaction 时出现的 NullPointerException 问题。(b/134673465)

版本 1.1.0-beta01

2019 年 6 月 5 日

发布了 androidx.fragment:fragment:1.1.0-beta01androidx.fragment:fragment-ktx:1.1.0-beta01androidx.fragment:fragment-testing:1.1.0-beta01。点击此处可查看此版本中包含的提交。

问题修复

  • 适用于嵌套 Fragment 的 androidx.lifecycle.Lifecycle 回调(具体而言是与 STARTEDRESUMEDPAUSEDSTOPPEDDESTROYED 相关的回调)现在已正确嵌套。(b/133497591)
  • 在 Fragment 的 onCreate() 中注册的 OnBackPressedCallback 实例现在正确地优先于子级 FragmentManager。(b/133175997)
  • 在父级 Fragment 被替换之后,子级 Fragment 不再具有动画效果。(b/121017790)
  • 现在,使用 animateLayoutChanges="true" 时,Fragment 动画和转换会被忽略,这修复了 Fragment 不会被正确销毁的问题。(b/116257087)

版本 1.1.0-alpha09

2019 年 5 月 16 日

发布了 androidx.fragment:fragment:1.1.0-alpha09androidx.fragment:fragment-ktx:1.1.0-alpha09androidx.fragment:fragment-testing:1.1.0-alpha09。点击此处可查看此版本中包含的提交内容。

API 变更

  • Fragment 现在会在主导航 Fragment 发生更改时接收对新的 onPrimaryNavigationFragmentChanged(boolean) 方法的回调。aosp/960857

问题修复

  • 由子级 Fragment 扩充的菜单项现在可以在父级 Fragment 被移除后正确地移除。b/131581013

版本 1.1.0-alpha08

2019 年 5 月 7 日

发布了 androidx.fragment:fragment:1.1.0-alpha08androidx.fragment:fragment-ktx:1.1.0-alpha08androidx.fragment:fragment-testing:1.1.0-alpha08。点击此处可查看此版本中包含的提交内容。

此版本与 Preference 1.1.0-alpha01 至 1.1.0-alpha04 不兼容。使用此版本的 Fragment 时,请升级至 Preference 1.1.0-alpha05。

新功能

  • 新增了一个采用超时的 postponeEnterTransition() 过载,经过此超时后 Fragment 将会自动调用 startPostponedEnterTransition() b/120803208

API 变更

  • 重大变更:移除了先前已弃用的需要 BundleFragmentFactory instantiate 方法。aosp/953856
  • 重大变更:已将 FragmentPagerAdapterFragmentStatePagerAdapter 中的 RESUME_ONLY_CURRENT_FRAGMENTUSE_SET_USER_VISIBLE_HINT 常量分别重命名为 BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENTBEHAVIOR_SET_USER_VISIBLE_HINTaosp/954782

问题修复

  • 通过 setMaxLifecycle() 为生命周期设定上限的 Fragment 在达到其最终状态之前将不会再恢复。b/131557151
  • setMaxLifecycle(Lifecycle.State.CREATED) 时,Fragment 将相应地销毁其视图。aosp/954180

版本 1.1.0-alpha07

2019 年 4 月 25 日

发布了 androidx.fragment:fragment:1.1.0-alpha07androidx.fragment:fragment-ktx:1.1.0-alpha07androidx.fragment:fragment-testing:1.1.0-alpha07。点击此处可查看此版本中包含的提交内容。

新功能

  • 您现在可以通过对 FragmentTransaction 调用 setMaxLifecycle() 来为 Fragment 设置最大生命周期状态。这将替换现已弃用的 setUserVisibleHint()FragmentPagerAdapterFragmentStatePagerAdapter 具有新的构造函数,允许您转换为新的行为。(b/129780800)

API 变更

  • FragmentScenario 上的 moveToState(STARTED) 现在只能在 API 级别为 24 以上的设备上调用。(b/129880016)

行为变更

  • 由于 (b/129907905) 的影响,在托管 Activity 重新创建后,返回堆栈上的 Fragment 将不会获得对 onCreateView() 的回调。onCreateView() 现在仅在 Fragment 变得可见时(即返回堆栈被弹出)才会被调用。

问题修复

  • 修复了在 XML 中使用 <fragment> 标记以及使用 FragmentActivityAppCompatActivitycontentLayoutId 构造函数时出现的问题。(b/129907905)
  • 更正了如下问题:配置发生更改后,返回堆栈上的 Fragment 未转为至少是 CREATED 状态,导致无法妥善处置 ViewModel 和保留了子级的 Fragment。(b/129593351)
  • 修复了保存实例状态后由于保留的 Fragment 不同步而导致的 restoreSaveState 崩溃问题。(b/130433793) (aosp/947824)
  • 修复了如下问题:如果 FragmentManager 具有返回堆栈,则无法调用添加时具有 Fragment 生命周期的 OnBackPressedCallback。如需了解更多详情,请参阅 androidx.activity 1.0.0-alpha07。(aosp/948209)
  • Fragment 不再对动画强制实施 LAYER_TYPE_HARDWARE。如果您特别需要硬件层动画,请将其设置为动画的一部分。(b/129486478)

版本 1.1.0-alpha06

2019 年 4 月 3 日

发布了 androidx.fragment:fragment:1.1.0-alpha06androidx.fragment:fragment-ktx:1.1.0-alpha06androidx.fragment:fragment-testing:1.1.0-alpha06。点击此处可查看此版本中包含的提交内容。

新功能

  • FragmentManager 抛出的异常现在会在消息中添加 Fragment 的名称。(b/67759402)

API 变更

  • FragmentFragmentActivity 现在包含采用 @LayoutRes int 的第二个构造函数,取代了以前使用 @ContentView 注释类的行为。此方法同时适用于应用和库模块。(b/128352521)
  • FragmentActivity 的 onActivityResult() 现在已正确标记为 @CallSuper。(b/127971684)
  • FragmentFactory 的采用参数 Bundle 的 instantiate 方法已弃用,应用应使用未采用 Bundle 的新 instantiate 过载。(b/128836103)
  • FragmentScenario 方法现在已使用 @StyleRes 正确进行注释。(aosp/924193)
  • 已弃用 FragmentTabHost。(b/127971835)
  • FragmentActivity 的 getThemedContext() 已移除。(aosp/934078)

问题修复

  • 修复了 1.1.0-alpha05 中导致传入 Fragment 在屏幕上闪烁的回归问题。(b/129405432)
  • 修复了在一系列 popBackStack+replace+popBackStack 操作后主导航 Fragment 丢失的问题。(b/124332597)
  • 修复了恢复 Fragment 状态时,在 Activity 上使用 @ContentView 构造函数时出现的问题。(b/127313094)
  • 更正了使用未连接到 FragmentManager 的 Fragment 来替换现有的目标 Fragment 时 setTargetFragment() 出现的逻辑问题。(aosp/932156)

版本 1.1.0-alpha05

2019 年 3 月 13 日

发布了 androidx.fragment:fragment:1.1.0-alpha05androidx.fragment:fragment-ktx:1.1.0-alpha05androidx.fragment:fragment-testing:1.1.0-alpha05。点击此处可查看此版本中包含的完整提交内容列表。

新功能

行为变更

  • 现在,如果使用连接到不同 FragmentManager 的 Fragment 来调用 remove()hide()show()detach()setPrimaryNavigationFragment(),则会抛出 IllegalStateException,而不是在无提示的情况下失败 (aosp/904301)

问题修复

  • FragmentActivityonNewIntent 现已使用 @CallSuper 正确标记 (b/124120586)
  • 修复了使用 getDialog().dismiss()getDialog().cancel()DialogFragmentonDismiss() 会被调用两次的问题 (b/126563750)

版本 1.1.0-alpha04

2019 年 2 月 7 日

发布了 androidx.fragment:fragment 1.1.0-alpha04androidx.fragment:fragment-ktx 1.1.0-alpha04androidx.fragment:fragment-testing 1.1.0-alpha04

新功能

  • 添加了对 @ContentView 类注释的支持,可让您指明应扩充哪个布局 XML 文件,作为替换 onCreateView() 的替代方法。建议在 onViewCreated() 中执行与视图相关的操作。(aosp/837619)
  • fragment-testing 现在依赖于 androidx.test:core-ktx 1.1.0 稳定版 (b/121209673)
  • 您现在可以将 openActionBarOverflowOrOptionsMenuFragmentScenario 结合使用,以测试 Fragment 托管的选项菜单 (b/121126668)

API 变更

  • 添加了 requireArguments() 方法,该方法会返回 @NonNull Bundle 或抛出 IllegalStateException (b/121196360)
  • 添加了一条说明,指明 getLifecycle()getViewLifecycleOwner()getViewLifecycleOwnerLiveData() 不应被替换,它们将在未来的版本中设为 final。如果您当前正在替换此方法,请提交功能请求。(aosp/880714)
  • 添加了一条说明,指明 getViewModelStore() 不应被替换,它将在未来的版本中设为 final。如果您当前正在替换此方法,请提交功能请求。(aosp/880713)
  • 修复了之前的 Fragment 版本的二进制文件兼容性问题。(aosp/887877) (aosp/889834)

问题修复

  • 在将 null 传递给 setTargetFragment() 时,可正确地清除目标 Fragment。(aosp/849969)
  • 修复了调用 onDestroy() 时或之后目标 Fragment 有时不可用的问题。(b/122312935)
  • DialogFragment 的 onDismiss() 现在会在 onDestroy() 之前被调用。(aosp/874133) (aosp/890734)

版本 1.1.0-alpha03

2018 年 12 月 17 日

新功能

  • Fragment 现在实现了 BundleSavedStateRegistryOwner 并依赖于新发布的 SavedState 库 [aosp/824380]
  • 添加了 by activityViewModels Kotlin 属性委托,以检索与包含的 Activity 相关联的 ViewModel [b/119050253]
  • by viewModels Kotlin 属性委托已扩展为采用可选的 lambda 方法来获取 ViewModelStoreOwner,从而允许您使用 val viewModel: MyViewModel by viewModels(::requireParentFragment) 之类的代码传递父级 Fragment 或其他自定义 ViewModelStoreOwner [b/119050253]

API 变更

  • FragmentScenario 现在允许您指定一个主题背景,例如 Theme.AppCompat [b/119054431]。这是一项重大变更。
  • 添加了 requireView() 方法,该方法会返回 @NonNull View 或抛出 IllegalStateException [b/120241368]
  • 添加了 requireParentFragment() 方法,该方法会返回 @NonNull Fragment 或抛出 IllegalStateException [b/112103783]

问题修复

  • 修复了“保存状态失败”这一 IllegalStateException b/120814739
  • 现在,从保存的实例状态恢复的 Fragment 始终接收非 null Bundle [b/119794496]
  • 已移除的 Fragment 在重新添加后将不会再重用其 Lifecycle 对象 [b/118880674]

版本 1.1.0-alpha02

2018 年 12 月 3 日

新功能

  • FragmentScenario 的 Kotlin 扩展程序现在允许您使用 Lambda 进行 Fragment 构造,以作为传入 FragmentFactory 实例的替代方法。(aosp/812913)

问题修复

  • 修复了在返回堆栈上使用嵌套 Fragment 时出现的 IllegalStateException 问题 (b/119256498)
  • 修复了将 FragmentScenario.recreate()FragmentFactory 结合使用时出现的崩溃问题 (aosp/820540)
  • 修复了移除 Fragment 之后目标 Fragment 无法访问的问题 (aosp/807634)

版本 1.1.0-alpha01

2018 年 11 月 5 日

这是 fragment-testing 工件和基于 androidx.test:core API 构建的 FragmentScenario 的第一个版本。如需了解更多详情,请参阅 Fragment 测试文档

新功能

  • 新增了用于单独测试 Fragment 的 FragmentScenario 类。
  • 您现在可以在任何 FragmentManager 上设置 FragmentFactory,以控制新的 Fragment 实例如何实例化。
  • 添加了新的 by viewModels() Kotlin 属性委托,用于从 Fragment 检索 ViewModel。
  • 现在,Fragment 的 onStop() 中取消了挂起输入事件(例如点击)这一行为。

API 变更

  • 显著扩展了 Fragment API 表面的可空性注释。

问题修复

  • 修复了导致 Fragment 操作在 LiveData 内部失败的问题 (b/77944637)

已知问题

  • 从 FragmentManager 移除一个 Fragment 之后,无法访问目标 Fragment。
  • fragment-testing 依赖于 androidx.test:core:1.0.0-beta01,而不是正确的 androidx.test:core:1.0.0