Fragment

将您的应用细分为托管在 Activity 中的多个独立屏幕。
最新更新 稳定版本 版本候选版 (RC) Beta 版本 Alpha 版本
2026 年 6 月 17 日 1.8.9 - - 1.9.0-alpha01

声明依赖项

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

在应用或模块的 build.gradle 文件中,为您需要的工件添加依赖项

Groovy

dependencies {
    def fragment_version = "1.8.9"

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

Kotlin

dependencies {
    val fragment_version = "1.8.9"

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

如需详细了解依赖项,请参阅添加构建依赖项

反馈

您的反馈有助于改进 Jetpack。如果您发现了新问题或有改进此库的想法,请告诉我们。在创建新问题之前,请先查看此库中的现有问题。您可以点击星标按钮,为您现有的问题投票。

创建新问题

如需了解详情,请参阅 问题跟踪器文档

版本 1.9

版本 1.9.0-alpha01

2026 年 6 月 17 日

androidx.fragment:fragment-*:1.9.0-alpha01 已发布。版本 1.9.0-alpha01 包含这些提交

API 变更

  • Fragment 现在实现了 ContextAware 接口,可用于在 Fragment 附加时执行代码。(I38019, b/477255355)

Bug 修复

  • 修复了在执行预测性返回手势期间,Activity 被切换到后台时 Fragment 导致的崩溃问题。(I55734, b/389589678)
  • UnsafeFragmentLifecycleObserverDetector 不再在组合 (composition) 内部运行。(Ic4176, b/501504696)
  • [来自 Fragment 1.8.9] 修复了以下问题:在取消会导致隐藏操作弹出的预测性返回手势时,会导致后续手势在使用动画工具时无法正确设置动画。(I0a400, b/384765586)
  • [来自 Fragment 1.8.9] 修复了以下错误:setMaxLifecyclepopBackStack 的组合可能导致无法将顶部 Fragment 移动到 RESUMED 状态。(I3448b, b/406127576)
  • [来自 Fragment 1.8.8] 修复了以下问题:FragmentManager 在尝试保存以 setMaxLifecycle(Lifecycle.State.INITIALIZED) 添加的 Fragment 的状态时会崩溃。这些 Fragment 因为从未使用过 onCreate(),所以不再有保存的状态或调用 onSaveInstanceState()。(I6e37a, b/408163315)
  • [来自 Fragment 1.8.7] 修复了 FragmentManager 在同一帧中进行弹出和替换操作后未处于正确状态的问题,这可能导致与预测性返回结合使用时发生崩溃。(I50ad1, b/380288461)
  • [来自 Fragment 1.8.6] FragmentContainerViewsetOnApplyWindowInsetsListener 覆盖现在接受空监听器。(I575f0, b/282790626)
  • [来自 Fragment 1.8.5] 修复了仅在预测性返回手势被取消或中断后由 saveBackStack 触发的 IllegalStateException 问题。(I3387d, b/342419080)
  • [来自 Fragment 1.8.4] 修复了在动态交换 AndroidFragment 实例正在使用的类时,AndroidFragment 中出现的 UninitializedPropertyAccessException。(I12dea, b/365578408)
  • [来自 Fragment 1.8.4] 修复了快速按系统返回键或执行快速手势返回会导致 Fragment 崩溃的问题。(Ibc038, b/364804225, b/364914301)
  • [来自 Fragment 1.8.4] 修复了 Fragment 中的一个问题:中断预测性返回手势会将 Fragment 管理器置于未定义状态,甚至最终显示错误的 Fragment。(If82e2, b/338624457)
  • [来自 Fragment 1.8.3] 如果 AndroidFragment 在包含它的 Activity/Fragment 的状态已经保存时被添加到组合中,它将不再崩溃。(I985e9, b/356643968)
  • [来自 Fragment 1.8.2] 在 FragmentManager 有挂起操作时触发系统返回将不再导致越界异常。(I9ba32, b/342316801)
  • [来自 Fragment 1.8.2] AndroidFragment 现在可以正确处理父 Fragment 被放入 Fragment 返回栈的情况,从而在弹出回到该 Fragment 时避免“找不到 id 的视图”的问题。(I94608, b/347706985)
  • [来自 Fragment 1.8.2] 通过接受 ViewGroupFragmentTransaction.add 方法添加的 Fragment 现在会在进行到 onStart() 之前等待 onContainerAvailable。这会影响该 API 的用户(例如 AndroidFragment),这些用户现在会等待 AndroidFragment 重新进入组合,然后再将其进行到 onStart()。(I94608, b/347706985)
  • [来自 Fragment 1.8.1] 修复了没有容器的 Fragment 在开始预测性返回手势时立即被 DESTROYED 的问题。(If6b83, b/345244539)

外部贡献

  • 将 fragment-ktx 合并到 fragment 库中。所有 Kotlin 扩展现在都是主 fragment 工件的一部分。fragment-ktx 现在是一个空的兼容性工件。感谢 Jake Wharton!(Idabaa)

1.8 版本

版本 1.8.9

2025 年 8 月 13 日

androidx.fragment:fragment-*:1.8.9 已发布。版本 1.8.9 包含这些提交

Bug 修复

  • 修复了以下问题:在取消会导致隐藏操作弹出的预测性返回手势时,会导致后续手势在使用动画工具时无法正确设置动画。(I0a400, b/384765586)
  • 修复了 setMaxLifecyclepopBackStack 的组合可能导致无法将顶部 Fragment 移动到 RESUMED 状态的错误。(I3448b, b/406127576)

版本 1.8.8

2025 年 6 月 4 日

androidx.fragment:fragment-*:1.8.8 已发布。版本 1.8.8 包含这些提交

Bug 修复

  • 修复了 FragmentManager 在尝试保存以 setMaxLifecycle(Lifecycle.State.INITIALIZED) 添加的 Fragment 的状态时会崩溃的问题。这些 Fragment 因为从未使用过 onCreate(),所以不再有保存的状态或调用 onSaveInstanceState()。(I6e37a)

版本 1.8.7

2025 年 5 月 20 日

androidx.fragment:fragment-*:1.8.7 已发布。版本 1.8.7 包含这些提交

Bug 修复

  • 修复了 FragmentManager 在同一帧中的弹出和替换操作后未处于正确状态的问题,这可能导致与通过 popBackStack 或预测性返回手势弹出返回栈结合使用时发生崩溃。(I50ad1)
  • 修复了因使用 AndroidX Transitions 而导致的崩溃,这种情况出现在快速连续的 Fragment 事务试图取消尚未开始的过渡且 AndroidX Transition 库未能正确清除过渡状态时。(参见 b/414612221)。(Ib5235)

版本 1.8.6

2025 年 2 月 12 日

androidx.fragment:fragment-*:1.8.6 已发布。版本 1.8.6 包含这些提交

Bug 修复

  • FragmentContainerViewsetOnApplyWindowInsetsListener 覆盖现在接受空监听器,这与框架允许的情况一致。(I575f0, b/282790626)

版本 1.8.5

2024 年 10 月 30 日

androidx.fragment:fragment-*:1.8.5 已发布。版本 1.8.5 包含这些提交

Bug 修复

  • 修复了仅在预测性返回手势被取消后由 saveBackStack 触发的 IllegalStateException。(I3387d, b/342419080)

版本 1.8.4

2024 年 10 月 2 日

androidx.fragment:fragment-*:1.8.4 已发布。版本 1.8.4 包含这些提交

Bug 修复

  • 修复了使用 Androidx Transitions 时,快速按下系统返回键或执行快速手势返回会导致 Fragment 崩溃的问题。(Ibc038, b/364804225)
  • 修复了 Fragment 中的一个问题:中断预测性返回手势会将 Fragment 管理器置于未定义状态,甚至最终显示错误的 Fragment。(If82e2, b/338624457)
  • 修复了在动态交换 AndroidFragment 实例正在使用的类时,AndroidFragment 中出现的 UninitializedPropertyAccessException。(I12dea)

1.8.3 版本

2024 年 9 月 4 日

androidx.fragment:fragment-*:1.8.3 已发布。版本 1.8.3 包含这些提交

Bug 修复

  • FragmentManager 现在在处理预测性返回手势时会正确考虑挂起的操作。这应能确保执行系统返回不再导致 IndexOutOfBoundsException。(I9ba32, b/342316801)
  • 如果 AndroidFragment 在包含它的 Activity/Fragment 的状态已经保存时被添加到组合中,它将不再崩溃。(I985e9, b/356643968)

1.8.2 版本

2024 年 7 月 24 日

androidx.fragment:fragment-*:1.8.2 已发布。版本 1.8.2 包含这些提交

Bug 修复

  • AndroidFragment 现在可以正确处理父 Fragment 被放入 Fragment 返回栈的情况,从而在弹出回到该 Fragment 时避免“找不到 id 的视图”的问题。(I94608)
  • 通过接受 ViewGroupFragmentTransaction.add 方法添加的 Fragment 现在会在进行到 onStart() 之前等待 onContainerAvailable。这会影响该 API 的用户(例如 AndroidFragment),这些用户现在会等待 AndroidFragment 重新进入组合,然后再将其进行到 onStart()。(I94608)

1.8.1 版本

2024 年 6 月 26 日

androidx.fragment:fragment-*:1.8.1 已发布。版本 1.8.1 包含这些提交

Bug 修复

  • 修复了没有容器的 Fragment 在开始预测性返回手势时立即被 DESTROYED 的问题。现在它们会被保持在 CREATED 状态,直到手势完成。(If6b83, b/345244539)

1.8.0 版本

2024 年 6 月 12 日

androidx.fragment:fragment-*:1.8.0 已发布。版本 1.8.0 包含这些提交

自 1.7.0 以来的重要变化

  • fragment-compose 工件现在包含一个 AndroidFragment Composable,允许通过 Fragment 类名将 Fragment 添加到 Compose 层级中。它会自动处理 Fragment 状态的保存和恢复。这应该作为之前推荐的通过使用 AndroidViewBinding 来扩充 Fragment 的方法的直接替代方案。
  • FragmentManagerOnBackStackChangedListener 接口上的 onBackStackChangeCancelled 回调现在作为 FragmentManager 中执行操作的一部分触发,使其在时间上更接近 onBackStackChangeCommitted 回调。

1.8.0-rc01 版本

2024 年 5 月 29 日

androidx.fragment:fragment-*:1.8.0-rc01 已发布。版本 1.8.0-rc01 包含这些提交

Bug 修复

  • FragmentManagers OnBackStackChangedListener 接口上的 onBackStackChangeCancelled 回调现在作为 FragmentManager 中执行操作的一部分触发,使其在时间上更接近 onBackStackChangeCommitted 回调。(I5ebfb, b/332916112)

1.8.0-beta01 版本

2024 年 5 月 14 日

androidx.fragment:fragment-*:1.8.0-beta01 已发布。版本 1.8.0-beta01 包含这些提交

Bug 修复

  • 来自 Fragment 1.7.1:预测性返回现在仅对所有 Fragment 都具有 Animator 或可寻址 Androidx Transition 的事务运行。这修复了取消部分可寻址事务会导致黑屏的问题。(I43037, b/339169168)

1.8.0-alpha02 版本

2024 年 4 月 17 日

androidx.fragment:fragment-*:1.8.0-alpha02 已发布。版本 1.8.0-alpha02 包含这些提交

Bug 修复

  • 来自 Fragment 1.7.0-rc02:添加了日志以说明为什么在没有其他过渡的情况下设置 sharedElement 会导致无法运行。(Iec48e)
  • 来自 Fragment 1.7.0-rc02:修复了一个 bug:如果将不可寻址的共享元素添加到所有其他过渡都是可寻址的事务中,会导致崩溃。现在,该事务将正确地被视为不可寻址。(I18ccd)

1.8.0-alpha01 版本

2024年4月3日

androidx.fragment:fragment-*:1.8.0-alpha01 已发布。版本 1.8.0-alpha01 包含这些提交

新功能

  • 新的 AndroidFragment Composable 允许通过 Fragment 类名将 Fragment 添加到 Compose 层级中。它会自动处理 Fragment 状态的保存和恢复。这可以用作 AndroidViewBinding Composable 的直接替代品。(b/312895363, Icf841)

文档变更

  • 更新了 OnBackStackChangedListener API 的文档,以说明它们的调用时机以及应如何使用它们。(I0bfd9)

依赖项更新

版本 1.7

版本 1.7.1

2024 年 5 月 14 日

androidx.fragment:fragment-*:1.7.1 已发布。版本 1.7.1 包含这些提交

Bug 修复

  • 预测性返回现在仅对所有 Fragment 都具有 Animator 或可寻址 Androidx Transition 的事务运行。这修复了取消部分可寻址事务会导致空白屏幕的问题。(I43037, b/339169168)

版本 1.7.0

2024 年 5 月 1 日

androidx.fragment:fragment-*:1.7.0 已发布。版本 1.7.0 包含这些提交

预测性返回手势支持

  • 当使用 Animator 或使用 AndroidX Transition 1.5.0 时,Fragment 现在提供对应用内预测性返回的支持。这允许用户通过在决定完成手势以提交事务或取消之前寻址您的 Animator/Transition,使用返回手势查看上一个 Fragment。
过渡系统 XML 资源 支持预测性返回
动画 R.anim
Animator R.animator
框架 Transition R.transition
AndroidX Transition,使用 Transition 1.4.1 或更低版本 R.transition
AndroidX Transition,使用 Transition 1.5.0 R.transition

如果您在加入预测性返回手势后在 Fragment 中发现任何预测性返回支持方面的问题,请通过示例项目提交针对 Fragment 的问题以复现您的问题。您可以通过在 Activity 的 onCreate() 中使用 FragmentManager.enabledPredictiveBack(false) 来禁用预测性返回。

FragmentManager.OnBackStackChangedListener() 现在提供 onBackStackChangeProgressed()onBackStackChangeCancelled(),分别用于接收预测性返回进度和取消事件。

Fragment Compose 工件

创建了一个新的 fragment-compose 工件,旨在支持那些正处于从基于 Fragment 的架构向全 Compose 架构迁移过程中的应用。

此新工件中提供的第一个功能是 Fragment 上的 content 扩展方法,它通过为您创建一个 ComposeView 并设置正确的 ViewCompositionStrategy,使在单个 Fragment 的 UI 中使用 Compose 变得更加容易。

  class ExampleFragment : Fragment() {

      override fun onCreateView(
          inflater: LayoutInflater,
          container: ViewGroup?,
          savedInstanceState: Bundle?
      ) = content {
          // Write your @Composable content here
          val viewModel: ExampleViewModel = viewModel()

          // or extract it into a separate, testable method
          ExampleComposable(viewModel)
      }
  }

版本 1.7.0-rc02

2024 年 4 月 17 日

androidx.fragment:fragment-*:1.7.0-rc02 已发布。版本 1.7.0-rc02 包含这些提交

Bug 修复

  • 添加了日志以说明为什么在没有其他过渡的情况下设置 sharedElement 会导致无法运行。(Iec48e)
  • 修复了一个 bug:如果将不可寻址的共享元素添加到所有其他过渡都是可寻址的事务中,会导致崩溃。现在,该事务将正确地被视为不可寻址。(I18ccd)

版本 1.7.0-rc01

2024年4月3日

androidx.fragment:fragment-*:1.7.0-rc01 已发布。版本 1.7.0-rc01 包含这些提交

依赖项更新

版本 1.7.0-beta01

2024年3月20日

androidx.fragment:fragment-*:1.7.0-beta01 已发布。版本 1.7.0-beta01 包含这些提交

API 变更

  • FragmentHostCallback 现在用 Kotlin 编写,以便 Host 泛型的可空性与 onGetHost() 返回类型的可空性相匹配。(I40af5)

Bug 修复

  • 修复了在不在容器中的 Fragment 上提交预测性返回手势时,该 Fragment 永远不会被销毁的问题。Fragment 现在将立即移动到最终状态。(Ida0d9)
  • 修复了 Fragment 中的一个问题:用预测性返回手势中断传入的过渡会销毁进入的视图,并留下一个空白屏幕。(Id3f22, b/319531491)

版本 1.7.0-alpha10

2024 年 2 月 7 日

androidx.fragment:fragment-*:1.7.0-alpha10 已发布。版本 1.7.0-alpha10 包含这些提交。

Bug 修复

  • 修复了之前 Fragment 版本中的已知问题:如果从未通过 addOnBackStackChangedListener 添加过 FragmentManager.OnBackStackChangedListener,则使用 Fragment 的预测性返回支持 Animator 或 AndroidX Transition 会导致 Fragment 从 handleOnBackProgressed 抛出 NullPointerException。(I7c835)

版本 1.7.0-alpha09

2024 年 1 月 24 日

androidx.fragment:fragment-*:1.7.0-alpha09 已发布。版本 1.7.0-alpha09 包含这些提交。

Fragment Compose 工件

创建了一个新的 fragment-compose 工件,旨在支持那些正处于从基于 Fragment 的架构向全 Compose 架构迁移过程中的应用。

此新工件中提供的第一个功能是 Fragment 上的 content 扩展方法,它通过为您创建一个 ComposeView 并设置正确的 ViewCompositionStrategy,使在单个 Fragment 的 UI 中使用 Compose 变得更加容易。(561cb7, b/258046948)

class ExampleFragment : Fragment() {

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ) = content {
        // Write your @Composable content here
        val viewModel: ExampleViewModel = viewModel()

        // or extract it into a separate, testable method
        ExampleComposable(viewModel)
    }
}

新功能

  • FragmentManager.OnBackStackChangedListener() 现在提供 onBackStackChangeProgressed()onBackStackChangeCancelled(),分别用于接收预测性返回进度和取消事件。(214b87)

已知问题

  • 在使用 Fragment 的预测性返回支持 Animator 或 AndroidX Transition 时,如果从未通过 addOnBackStackChangedListener 添加过 FragmentManager.OnBackStackChangedListener,Fragment 将从 handleOnBackProgressed 抛出 NullPointerException。手动添加监听器可以绕过此崩溃。Fragment 的下一个版本将提供修复程序。

版本 1.7.0-alpha08

2024 年 1 月 10 日

androidx.fragment:fragment-*:1.7.0-alpha08 已发布。版本 1.7.0-alpha08 包含这些提交。

清理

版本 1.7.0-alpha07

2023 年 11 月 29 日

androidx.fragment:fragment-*:1.7.0-alpha07 已发布。版本 1.7.0-alpha07 包含这些提交。

Bug 修复

  • 修复了由设置共享元素过渡且未能同时设置 enter/exitTransition 引起的 NullPointerException。(I8472b)
  • 来自 Fragment 1.6.2:当 FragmentContainerView 的 Fragment 被扩充时,其状态(如 FragmentManager、Host 和 id)现在可以在 onInflate 回调中访问。(I1e44c, b/307427423)
  • 来自 Fragment 1.6.2:当使用 clearBackStack 移除一组 Fragment 时,任何嵌套 Fragment 的 ViewModel 现在都将在父 Fragment 的 ViewModels 被清除时被清除。(I6d83c, b/296173018)

版本 1.7.0-alpha06

2023年10月4日

androidx.fragment:fragment-*:1.7.0-alpha06 已发布。版本 1.7.0-alpha06 包含这些提交。

依赖项更新

版本 1.7.0-alpha05

2023年9月20日

androidx.fragment:fragment-*:1.7.0-alpha05 已发布。版本 1.7.0-alpha05 包含这些提交。

新功能

  • 当使用 Androidx Transitions 时,Fragment 现在提供对预测性返回的支持。这允许您使用返回手势,通过您的自定义 Androidx Transition 寻址到上一个 Fragment,然后再决定通过完成的手势提交或取消事务。您必须依赖 Transition 1.5.0-alpha03 版本才能启用此功能。(Ib49b4, b/285175724)

已知问题

  • 目前存在一个问题:在取消一次带有过渡的返回手势后,下一次启动返回手势时将无法运行过渡,从而导致空白屏幕。这可能是由 Transition 库中的问题引起的。(b/300157785)。如果您看到此问题,请通过示例项目提交针对 Fragment 的问题以复现您的问题。您可以通过在 Activity 的 onCreate() 中使用 FragmentManager.enabledPredictiveBack(false) 来禁用预测性返回。

版本 1.7.0-alpha04

2023年9月6日

androidx.fragment:fragment-*:1.7.0-alpha04 已发布。版本 1.7.0-alpha04 包含这些提交。

Bug 修复

  • 修复了在取消预测性返回手势时,Fragment 未能达到正确生命周期状态的问题。(I7cffe, b/297379023)
  • 修复了允许动画与过渡同时运行的回归问题。(I59f36)
  • 修复了在 Fragment 中使用预测性返回时,尝试在返回栈倒数第二个 Fragment 上连续两次快速后退会导致崩溃的问题。(Ifa1a4)

版本 1.7.0-alpha03

2023 年 8 月 23 日

androidx.fragment:fragment-*:1.7.0-alpha03 已发布。版本 1.7.0-alpha03 包含这些提交。

Bug 修复

  • 修复了在 Fragment 中使用预测性返回时导致 Fragment 管理器返回栈中的第一个 Fragment 被跳过,并且在通过 3 按钮导航或预测性返回手势使用系统返回时 Activity 结束的问题。(I0664b, b/295231788)

版本 1.7.0-alpha02

2023年8月9日

androidx.fragment:fragment-*:1.7.0-alpha02 已发布。版本 1.7.0-alpha02 包含这些提交。

Bug 修复

  • 当使用来自 API 34 的带有预测性返回手势的 Fragment 时,如果您使用的是不支持寻址的过渡系统(AnimationsTransitions)或根本不使用过渡,Fragment 现在将等待手势完成后再执行返回操作。(I8100c)

版本 1.7.0-alpha01

2023 年 6 月 7 日

androidx.fragment:fragment-*:1.7.0-alpha01 已发布。此版本是在内部分支中开发的。

新功能

  • 在使用 Animator 时,Fragment 现在提供对应用内预测性返回的支持。这允许您在通过手势完成提交事务或取消之前,使用您的自定义 Animator 通过返回手势查看上一个 Fragment。您还可以通过使用实验性的 enablePredictiveBack() 并传入 false 来禁用此新行为。

版本 1.6

版本 1.6.2

2023 年 11 月 1 日

androidx.fragment:fragment-*:1.6.2 已发布。版本 1.6.2 包含这些提交。

Bug 修复

  • FragmentContainerView 的 Fragment 被扩充时,其状态(如 FragmentManager、Host 和 id)现在可以在 onInflate 回调中访问。(I1e44c, b/307427423)
  • 当使用 clearBackStack 移除一组 Fragment 时,任何嵌套 Fragment 的 ViewModel 现在都将在父 Fragment 的 ViewModels 被清除时被清除。(I6d83c, b/296173018)

版本 1.6.1

2023 年 7 月 26 日

androidx.fragment:fragment-*:1.6.1 已发布。版本 1.6.1 包含这些提交。

Bug 修复

  • 修复了以下问题:在 Activity 停止但未销毁时存储的已保存状态,即使在 Fragment 实例移回 RESUMED 状态后,也会被错误地缓存。当使用多个返回栈 API 保存和恢复该 Fragment 时,如果该 Fragment 实例在返回栈上,这会导致使用该缓存状态。(I71288, b/246289075)

依赖项更新

  • Fragment 现在依赖于 Activity 1.7.2。这修复了 Kotlin 用户无法在没有对 Activity 的显式依赖的情况下扩展 ComponentDialog 的问题。(b/287509323)

版本 1.6.0

2023 年 6 月 7 日

androidx.fragment:fragment-*:1.6.0 已发布。版本 1.6.0 包含这些提交。

自 1.5.0 以来的重要更改

  • Fragment 的已保存状态已被完全拆分为私有库状态(自定义 Parcelable 类)和开发者提供的状态,后者现在始终存储在 Bundle 中,从而可以确定 Fragment 状态的确切来源。
  • FragmentManager.OnBackStackChangedListener 接口已扩展了两个额外的回调:onBackStackChangeStartedonBackStackChangeCommitted,它们分别在每个 Fragment 被添加到/从 Fragment 返回栈中移除之前,以及在事务提交之后调用。
  • FragmentStrictMode 添加了一个新的 WrongNestedHierarchyViolation,用于检测子 Fragment 嵌套在其父级的视图层级中,但未添加到父级的 childFragmentManager 中的情况。
  • 接受 IntentIntentSenderFragmentFragmentManager API 现在已正确地用 @NonNull 注解,以防止传入空值,因为空值总是会立即导致这些方法调用的相应 android 框架 API 崩溃。
  • DialogFragment 现在通过 requireComponentDialog() API 提供对底层 ComponentDialog 的访问。
  • Fragment 现在依赖于 Lifecycle 2.6.1
  • Fragment 现在依赖于 SavedState 1.2.1
  • Fragment 现在依赖于 ProfileInstaller 1.3.0
  • fragment-testing-manifest 工件将清单条目与 fragment-testing 组件的其余部分分离开来。这意味着您可以执行以下操作:

    debugImplementation("androidx.fragment:fragment-testing-manifest:X.Y.Z")
    androidTestImplementation("androidx.fragment:fragment-testing:X.Y.Z")
    

    这避免了由于 fragment-testingandroidx.test 之间的版本偏差而导致的冲突。

版本 1.6.0-rc01

2023 年 5 月 10 日

androidx.fragment:fragment-*:1.6.0-rc01 已发布。版本 1.6.0-rc01 包含这些提交。

Bug 修复

  • 修复了连续发出多个 startActivityForResult 请求时 ActivityResult 以错误请求代码发送的问题。(If0b9d, b/249519359)
  • 修复了 onBackStackChangeListener 回调被分发给实际上并未更改返回栈的事务的问题(如果它们与更改返回栈的事务混合在一起)。(I0eb5c, b/279306628)

版本 1.6.0-beta01

2023 年 4 月 19 日

androidx.fragment:fragment-*:1.6.0-beta01 已发布。版本 1.6.0-beta01 包含这些提交。

Bug 修复

  • 将带有超时的 postponeEnterTransition 与替换延迟的 Fragment 一起使用,不再导致延迟的 Fragment 泄露。(I2ec7d, b/276375110)
  • 新的 onBackStackChangeStartedonBackStackChangeCommitted 回调现在只会分发一个 Fragment 一次,即使多个事务包含同一个 Fragment。(Ic6b69)

版本 1.6.0-alpha09

2023 年 4 月 5 日

androidx.fragment:fragment-*:1.6.0-alpha09 已发布。版本 1.6.0-alpha09 包含这些提交。

API 变更

  • DialogFragment 现在通过 requireComponentDialog() API 提供对底层 ComponentDialog 的访问。(I022e3, b/234274777)
  • Fragment commitNow()executePendingTransactions()popBackStackImmediate() API 已用 @MainThread 注解,这意味着它们现在在未从主线程调用时都会抛出构建错误,而不是等待在运行时失败。(Ic9665, b/236538905)

Bug 修复

  • 修复了 FragmentManager 中的一个 bug,其中在同一帧中保存和恢复可能会导致崩溃。(Ib36af, b/246519668)
  • OnBackStackChangedListeneronBackStackChangeStartedonBackStackChangeCommitted 回调现在仅在 FragmentManager 返回栈发生更改时执行。(I66055, b/274788957)

版本 1.6.0-alpha08

2023 年 3 月 22 日

androidx.fragment:fragment-*:1.6.0-alpha08 已发布。版本 1.6.0-alpha08 包含这些提交。

行为变更

  • OnBackStackChangedListener.onBackStackChangeCommited 回调的计时已调整为在 Fragment 操作执行之前执行。这确保了回调永远不会收到已分离的 Fragment。(I66a76, b/273568280)

Bug 修复

  • 来自 Fragment 1.5.6:修复了在 setFragmentResultListener 内部调用 clearFragmentResultListener 如果 Lifecycle 已经处于 STARTED 状态且结果已经可用时不起作用的问题。(If7458)

依赖项更新

版本 1.6.0-alpha07

2023 年 3 月 8 日

androidx.fragment:fragment-*:1.6.0-alpha07 已发布。版本 1.6.0-alpha07 包含这些提交。

Bug 修复

  • 来自 Fragment 1.5.6:修复了移除任何 Fragment(无论它是否添加了菜单项)都会使 Activity 的菜单失效的问题。(50f098, b/244336571)

版本 1.6.0-alpha06

2023 年 2 月 22 日

androidx.fragment:fragment-*:1.6.0-alpha06 已发布。版本 1.6.0-alpha06 包含这些提交。

行为变更

  • FragmentManageronBackStackChangedListener 上的新 onBackStackChangedStarted 回调现在将在 Fragment 开始移动到其目标状态之前执行。(I34726)

版本 1.6.0-alpha05

2023 年 2 月 8 日

androidx.fragment:fragment-*:1.6.0-alpha05 已发布。版本 1.6.0-alpha05 包含这些提交。

新功能

  • FragmentManager.OnBackStackChagnedListener 接口现在提供了两个额外的回调:onBackStackChangeStartedonBackStackChangeCommitted,它们允许在 FragmentManager 中发生返回栈更改时提供更多信息和控制。(Ib7ce5, b/238686802)

API 变更

  • 接受 IntentIntentSenderFragmentFragmentManager API 现在已正确地用 @NonNull 注解,以防止传入空值,因为空值总是会立即导致这些方法调用的相应 Android 框架 API 崩溃。(I06fd4)

版本 1.6.0-alpha04

2022 年 12 月 7 日

androidx.fragment:fragment-*:1.6.0-alpha04 已发布。版本 1.6.0-alpha04 包含这些提交。

新功能

  • FragmentStrictMode 添加了一个新的 WrongNestedHierarchyViolation,用于检测子 Fragment 嵌套在其父级的视图层级中,但未添加到父级的 childFragmentManager 中的情况。(I72521, b/249299268)

行为变更

  • Fragment 现在在 onAttach() 之前恢复其 SavedStateRegistry 状态,确保其在所有向上生命周期方法中都可用。(I1e2b1)

API 变更

  • fragment-testing-manifest 工件将清单条目与 fragment-testing 组件的其余部分分离开来。这意味着您可以执行以下操作:
debugImplementation("androidx.fragment:fragment-testing-manifest:X.Y.Z")
androidTestImplementation("androidx.fragment:fragment-testing:X.Y.Z")

这避免了由于 fragment-testingandroidx.test 之间的版本偏差而导致的冲突。(I8e534, b/128612536)

Bug 修复

版本 1.6.0-alpha03

2022 年 10 月 5 日

androidx.fragment:fragment:1.6.0-alpha03androidx.fragment:fragment-ktx:1.6.0-alpha03androidx.fragment:fragment-testing:1.6.0-alpha03 已发布。版本 1.6.0-alpha03 包含这些提交。

API 变更

  • 扩展 DialogFragment 的类现在将被要求在它们的 onDismiss() 覆盖中调用 super。(I14798, b/238928865)

Bug 修复

  • 修复了由集成新的提供程序回调接口(OnConfigurationChangedProviderOnMultiWindowModeChangedProviderOnTrimMemoryProviderOnPictureInPictureModeChangedProvider)引起的回归,以确保 Fragment 始终获得正确的回调。(I9b380,I34581, (I8dfe6, b/242570955),If9d6b,Id0096,I690b3,I2cba2)

版本 1.6.0-alpha02

2022 年 8 月 24 日

androidx.fragment:fragment:1.6.0-alpha02androidx.fragment:fragment-ktx:1.6.0-alpha02androidx.fragment:fragment-testing:1.6.0-alpha02 已发布。版本 1.6.0-alpha02 包含这些提交。

Bug 修复

  • 来自 Fragment 1.5.2:修复了同时执行 popBackStack()replace() 事务可能导致退出的 Fragment 运行错误的 Animation/Animator 的问题。(Ib1c07, b/214835303)

版本 1.6.0-alpha01

2022 年 7 月 27 日

androidx.fragment:fragment:1.6.0-alpha01androidx.fragment:fragment-ktx:1.6.0-alpha01androidx.fragment:fragment-testing:1.6.0-alpha01 已发布。版本 1.6.0-alpha01 包含这些提交。

行为变更

  • Fragment 的已保存状态已被完全拆分为私有库状态(自定义 Parcelable 类)和开发者提供的状态,后者现在始终存储在 Bundle 中,从而可以确定 Fragment 状态的确切来源。(b/207158202)

Bug 修复

  • 来自 Fragment 1.5.1:修复了 DialogFragmentCallbacksDetector 中的回归,其中使用 AGP 7.4 捆绑的 lint 版本会导致 lint 崩溃。(b/237567009)

依赖项更新

版本 1.5

版本 1.5.7

2023 年 4 月 19 日

androidx.fragment:fragment:1.5.7androidx.fragment:fragment-ktx:1.5.7androidx.fragment:fragment-testing:1.5.7 已发布。版本 1.5.7 包含这些提交。

Bug 修复

  • 将带有超时的 postponeEnterTransition 与替换延迟的 Fragment 一起使用,不再导致延迟的 Fragment 泄露。(I2ec7d, b/276375110)

版本 1.5.6

2023 年 3 月 22 日

androidx.fragment:fragment:1.5.6androidx.fragment:fragment-ktx:1.5.6androidx.fragment:fragment-testing:1.5.6 已发布。版本 1.5.6 包含这些提交。

Bug 修复

  • 修复了移除任何 Fragment(无论它是否添加了菜单项)都会使 Activity 的菜单失效的问题。(50f098, b/244336571)
  • 修复了在 setFragmentResultListener 内部调用 clearFragmentResultListener 如果 Lifecycle 已经处于 STARTED 状态且结果已经可用时不起作用的问题。(If7458)

版本 1.5.5

2022 年 12 月 7 日

androidx.fragment:fragment:1.5.5androidx.fragment:fragment-ktx:1.5.5androidx.fragment:fragment-testing:1.5.5 已发布。版本 1.5.5 包含这些提交。

Bug 修复

  • Fragment 将不再错误地将 ViewModel 状态保存为视图注册表已保存状态的一部分。(I10d2b, b/253546214)

版本 1.5.4

2022 年 10 月 24 日

androidx.fragment:fragment:1.5.4androidx.fragment:fragment-ktx:1.5.4androidx.fragment:fragment-testing:1.5.4 已发布。版本 1.5.4 包含这些提交。

Bug 修复

  • 修复了使用带有未实现提供程序回调接口(OnConfigurationChangedProviderOnMultiWindowModeChangedProviderOnTrimMemoryProviderOnPictureInPictureModeChangedProvider)的主机的自定义 FragmentController,并调用其已弃用的分发函数会导致无法分发到子 Fragment 的错误。(I9b380)

版本 1.5.3

2022 年 9 月 21 日

androidx.fragment:fragment:1.5.3androidx.fragment:fragment-ktx:1.5.3androidx.fragment:fragment-testing:1.5.3 已发布。版本 1.5.3 包含这些提交。

Bug 修复

  • 修复了导致返回栈上的 Fragment 获取 onMultiWindowModeChanged()onPictureInPictureModeChanged()onLowMemory()onConfigurationChanged() 回调的错误。(I34581, I8dfe6, b/242570955)
  • 嵌套子 Fragment 将不再接收多个 onMultiWindowModeChanged()onPictureInPictureModeChanged()onLowMemory()onConfigurationChanged() 回调。(I690b3, Id0096, If9d6b, I2cba2)

版本 1.5.2

2022 年 8 月 10 日

androidx.fragment:fragment:1.5.2androidx.fragment:fragment-ktx:1.5.2androidx.fragment:fragment-testing:1.5.2 已发布。版本 1.5.2 包含这些提交。

Bug 修复

  • 修复了同时执行 popBackStack()replace() 事务可能导致退出的 Fragment 运行错误的 Animation/Animator 的问题。(Ib1c07, b/214835303)

版本 1.5.1

2022 年 7 月 27 日

androidx.fragment:fragment:1.5.1androidx.fragment:fragment-ktx:1.5.1androidx.fragment:fragment-testing:1.5.1 已发布。版本 1.5.1 包含这些提交。

Bug 修复

  • 修复了 DialogFragmentCallbacksDetector 中的回归,其中使用 AGP 7.4 捆绑的 lint 版本会导致 lint 崩溃。(b/237567009)

依赖项更新

版本 1.5.0

2022 年 6 月 29 日

androidx.fragment:fragment:1.5.0androidx.fragment:fragment-ktx:1.5.0androidx.fragment:fragment-testing:1.5.0 已发布。版本 1.5.0 包含这些提交。

自 1.4.0 以来的重要更改

  • CreationExtras 集成 - Fragment 现在能够通过 Lifecycle 2.5.0CreationExtras 提供无状态 ViewModelProvider.Factory
  • 组件对话框集成 - DialogFragment 现在通过 Activity 1.5.0 使用 ComponentDialog 作为 onCreateDialog() 返回的默认对话框。
  • 保存实例状态重构 - Fragment 已开始改变其保存实例状态的方式。这是一项旨在帮助明确识别 Fragment 中保存了什么状态以及状态来源的工作。目前的变更包括:
    • FragmentManager 现在将其已保存的实例状态保存到 Bundle 中,而不是直接保存在自定义 Parcelable 中。
    • 通过 Fragment Result API 设置且尚未交付的结果现在与 FragmentManager 的内部状态分开保存。
    • 与每个单独 Fragment 关联的状态现在与 FragmentManager 的内部状态分开保存,从而允许您将与单个 Fragment 关联的已保存状态量与 Fragment 调试日志中存在的唯一 ID 相关联。

其他更改

  • FragmentStrictMode 现在提供了一种功能,允许私有第三方 Fragment 通过使用带有类名的 allowViolation() 来绕过特定的违规惩罚。
  • 用于向您的 Activity 的 ActionBar 提供菜单的 Fragment API 已被弃用。在 Activity 1.4.0 中添加的 MenuHostMenuProvider API 提供了一个可测试、生命周期感知且 Fragment 应该使用的等效 API 表面。

版本 1.5.0-rc01

2022 年 5 月 11 日

androidx.fragment:fragment:1.5.0-rc01androidx.fragment:fragment-ktx:1.5.0-rc01androidx.fragment:fragment-testing:1.5.0-rc01 已发布。版本 1.5.0-rc01 包含这些提交。

保存实例状态重构

  • 与每个单独 Fragment 关联的状态现在与 FragmentManager 的内部状态分开保存,从而允许您将与单个 Fragment 关联的已保存状态量与 Fragment 调试日志中存在的唯一 ID 相关联。(a153e0, b/207158202)

版本 1.5.0-beta01

2022 年 4 月 20 日

androidx.fragment:fragment:1.5.0-beta01androidx.fragment:fragment-ktx:1.5.0-beta01androidx.fragment:fragment-testing:1.5.0-beta01 已发布。版本 1.5.0-beta01 包含这些提交。

API 变更

  • DialogFragment 添加了一个新的 dismissNow 方法,该方法使用 commitNow 以与 showNow 函数保持一致。请注意,这不会使 Dialog 立即被销毁,它只会同步更新 FragmentManager 的状态。(I15c36, b/72644830)

保存实例状态重构

  • FragmentManager 现在将其已保存的实例状态保存到 Bundle 中,而不是直接保存在自定义 Parcelable 中。这是为实际由 Fragment 保存的内容提供额外透明度的第一步。(I93807, b/207158202)
  • 通过 Fragment Result API 设置且尚未交付的结果现在与 FragmentManager 的内部状态分开保存。这将允许对作为已保存实例状态一部分保存的结果提供额外的透明度。(I6ea12, b/207158202)

版本 1.5.0-alpha05

2022 年 4 月 6 日

androidx.fragment:fragment:1.5.0-alpha05androidx.fragment:fragment-ktx:1.5.0-alpha05androidx.fragment:fragment-testing:1.5.0-alpha05 已发布。版本 1.5.0-alpha05 包含这些提交。

API 变更

1.5.0-alpha04 版本

2022 年 3 月 23 日

androidx.fragment:fragment:1.5.0-alpha04androidx.fragment:fragment-ktx:1.5.0-alpha04androidx.fragment:fragment-testing:1.5.0-alpha04 已发布。版本 1.5.0-alpha04 包含这些提交。

API 变更

  • 用于向 Activity 的 ActionBar 提供菜单的 Fragment API 已弃用,因为它们将 fragment 与 activity 紧密耦合,且无法在隔离环境中进行测试。Activity 1.4.0-alpha01 中添加的 MenuHostMenuProvider API 提供了一种可测试、生命周期感知的同等 API 接口,fragment 应该使用这些接口。(I50a59I20758

Bug 修复

  • SavedStateViewFactory 现在支持在通过 SavedStateRegistryOwner 初始化时也使用 CreationExtras。如果提供了 extras,则会忽略已初始化的参数。(I6c43bb/224844583

版本 1.5.0-alpha03

2022 年 2 月 23 日

androidx.fragment:fragment:1.5.0-alpha03androidx.fragment:fragment-ktx:1.5.0-alpha03androidx.fragment:fragment-testing:1.5.0-alpha03 已发布。版本 1.5.0-alpha03 包含这些提交。

API 变更

  • 现在可以将 CreationExtras 传递给 by viewModels()by activityViewModels() 函数。(Ibefe7b/217601110

行为变更

版本 1.5.0-alpha02

2022 年 2 月 9 日

androidx.fragment:fragment:1.5.0-alpha02androidx.fragment:fragment-ktx:1.5.0-alpha02androidx.fragment:fragment-testing:1.5.0-alpha02 已发布。版本 1.5.0-alpha02 包含这些提交。

新功能

  • FragmentStrictMode 现在允许私有的第三方 fragment 通过使用带有类名的 allowViolation() 来绕过特定的违规惩罚。(I8f678

版本 1.5.0-alpha01

2022 年 1 月 26 日

androidx.fragment:fragment:1.5.0-alpha01androidx.fragment:fragment-ktx:1.5.0-alpha01androidx.fragment:fragment-testing:1.5.0-alpha01 已发布。Version 1.5.0-alpha01 包含这些提交。

新功能

Bug 修复

  • 摘自 Fragment 1.4.1:当从 xml 生成的视图 ID 为负值时,FragmentContainerView 不再抛出非法状态异常。(Ic185bb/213086140
  • 摘自 Fragment 1.4.1:当将自定义 ownerProducer lambda 与 by viewModels() 延迟函数一起使用时,如果未提供自定义 ViewModelProvider.Factory,它现在将使用来自该所有者的 defaultViewModelProviderFactory,而不是始终使用 fragment 的工厂。(I56170b/214106513
  • 修复了从 FragmentregisterForActivityResult() 回调中首次访问 ViewModel 时发生的崩溃。(Iea2b3

版本 1.4

版本 1.4.1

2022 年 1 月 26 日

androidx.fragment:fragment:1.4.1androidx.fragment:fragment-ktx:1.4.1androidx.fragment:fragment-testing:1.4.1 已发布。版本 1.4.1 包含这些提交。

Bug 修复

  • FragmentContainerView 不再在从 xml 生成的视图 ID 为负值时抛出非法状态异常。(Ic185bb/213086140
  • 当将自定义 ownerProducer lambda 与 by viewModels() 延迟函数一起使用时,如果未提供自定义 ViewModelProvider.Factory,它现在将使用来自该所有者的 defaultViewModelProviderFactory,而不是始终使用 fragment 的工厂。(I56170b/214106513

版本 1.4.0

2021 年 11 月 17 日

androidx.fragment:fragment:1.4.0androidx.fragment:fragment-ktx:1.4.0androidx.fragment:fragment-testing:1.4.0 已发布。版本 1.4.0 包含这些提交。

自 1.3.0 以来的重要变更

  • FragmentStrictMode API 提供运行时检查,允许您验证您的应用或您所依赖的库是否没有调用已弃用的 fragment API。当检测到违规时,您可以选择打印日志消息、触发自定义监听器或让应用崩溃。控制启用哪些检查以及触发哪些“惩罚”的 FragmentStrictMode.Policy 可以通过新的 setStrictModePolicy() 方法在 FragmentManager 上设置。该策略适用于该 FragmentManager,并传递应用于任何未设置自己唯一策略的子 fragment 管理器。请参阅 针对 fragment 的 StrictMode
  • FragmentContainerView 现在提供一个 getFragment() 方法,该方法返回最近添加到容器中的 fragment。它使用与 findFragmentById() 相同的逻辑,并带有 FragmentContainerView 的 ID,但允许链式调用。

    val navController = binding.container.getFragment<NavHostFragment>().navController
    
  • FragmentScenario 现在实现了 Closeable,允许您将其与 Kotlin 的 use 方法或 try-with-resources 一起使用。

  • 添加了 FragmentTransaction#TRANSIT_FRAGMENT_MATCH_ACTIVITY_{OPEN, CLOSE},用于指定是否在 fragment 转换中启用从主题中获取的标准 Activity 转换动画。

  • 已移除实验性 API FragmentManager.enableNewStateManager(boolean)新的状态管理器现在是唯一可用的选项。

多重返回栈 (Multiple back stacks)

FragmentManager 维护一个返回栈,由使用 addToBackStack() 的 fragment 事务组成。这允许您弹出这些事务并返回到以前的状态,使用 使用 fragment 保存状态 的机制来允许 fragment 适当地恢复其状态。

此版本通过提供三个新的 FragmentManager API 扩展了这些机制:saveBackStack(String name)restoreBackStack(String name)clearBackStack(String name)。这些 API 使用与 addToBackStack() 相同的 name 来保存 FragmentTransaction 的状态以及在这些事务中添加的每个 fragment 的状态,并允许您稍后恢复这些事务及其 fragment,并保持其状态完整。这允许您通过保存当前的返回栈并恢复已保存的返回栈,有效地在多个返回栈之间“切换”。

saveBackStack() 的操作类似于 popBackStack(),因为它是异步的,并且会导致所有回到该特定名称的 fragment 事务被逆转(“弹出”),并且任何已添加的 fragment 都会被销毁和移除,但它在几个重要方面有所不同:

  • saveBackStack() 始终是包含性的。
  • popBackStack() 不同(如果未找到指定的名称或提供了空名称,它将弹出返回栈上的所有事务),如果您之前没有使用该精确的非空名称提交过使用 addToBackStack() 的 fragment 事务,saveBackStack() 将不会执行任何操作。
  • 保存从这些事务中添加的所有 fragment 的状态。这意味着每个 fragment 的视图状态都被存储,每个 fragment 的 onSaveInstanceState() 被调用并且该状态被恢复,并且与这些 fragment 关联的任何 ViewModel 实例都被保留(并且不会调用它们的 onCleared())。

可与 saveBackStack() 一起使用的 fragment 事务必须满足特定条件:

  • 每个 fragment 事务必须使用 setReorderingAllowed(true) 以确保事务可以作为单个原子操作恢复。
  • 保存的事务集必须是自包含的(即,它们不得显式引用该事务集之外的任何 fragment),以确保它们可以在以后的任何时间恢复,无论在此期间对返回栈做了哪些更改。
  • 任何保存的 fragment 不得是保留的 fragment,也不得在其子 fragment 的传递集中包含保留的 fragment,以确保在保存返回栈后 FragmentManager 不会返回对已保存 fragment 的任何引用。

saveBackStack() 类似,restoreBackStack()clearBackStack()(分别恢复以前保存的返回栈或清除以前保存的返回栈)如果之前没有使用相同的名称调用过 saveBackStack(),则都不会执行任何操作。

有关更多信息,请参阅 多重返回栈:深入探究

版本 1.4.0-rc01

2021 年 11 月 3 日

androidx.fragment:fragment:1.4.0-rc01 已发布,与 Fragment 1.4.0-beta01 相比没有变化。版本 1.4.0-rc01 包含这些提交。

版本 1.4.0-beta01

2021 年 10 月 27 日

androidx.fragment:fragment:1.4.0-beta01androidx.fragment:fragment-ktx:1.4.0-beta01androidx.fragment:fragment-testing:1.4.0-beta01 已发布。版本 1.4.0-beta01 包含这些提交。

Bug 修复

  • 父 fragment 现在将在启动自己的回调之前沿其整个层次结构向下分发 onHiddenChanged()。(Iedc20b/77504618
  • 从带有打开键盘的 fragment 切换到带有 recycler view 的 fragment 时,键盘现在会自动关闭。(I8b842b/196852211
  • DialogFragment 现在为您在调用 show()showNow()dismiss() 时创建的所有事务使用 setReorderingAllowed(true)。(Ie2c14
  • 极长的 Lint 警告 DetachAndAttachFragmentInSameFragmentTransaction 已缩短为 DetachAndAttachSameFragment。(e9eca3

版本 1.4.0-alpha10

2021 年 9 月 29 日

androidx.fragment:fragment:1.4.0-alpha10androidx.fragment:fragment-ktx:1.4.0-alpha10androidx.fragment:fragment-testing:1.4.0-alpha10 已发布。版本 1.4.0-alpha10 包含这些提交。

Lint

  • 添加了 DetachAndAttachFragmentInSameFragmentTransaction lint 警告,用于检测在同一个 FragmentTransaction 中对同一个 Fragment 调用 detach()attach() — 由于这些互补的操作在同一个事务中执行时会相互抵消,因此必须将它们拆分为单独的事务才能真正起作用。(aosp/1832956b/200867930
  • 添加了 FragmentAddMenuProvider lint 错误,用于在使用 MenuHostaddMenuProvider API 时纠正 Fragment 生命周期到 Fragment 视图生命周期的用法。(aosp/1830457b/200326272

文档更新

  • 用于 Activity Result API(即 startActivityForResultstartIntentSenderForResultonActivityResultrequestPermissionsonRequestPermissionsResult)现在处理的 API 的弃用消息都已扩展并包含更多详细信息。(cce80f
  • FragmentDialogFragmentonActivityCreated() 的弃用消息都已扩展并包含更多详细信息。(224db4

版本 1.4.0-alpha09

2021 年 9 月 15 日

androidx.fragment:fragment:1.4.0-alpha09androidx.fragment:fragment-ktx:1.4.0-alpha09androidx.fragment:fragment-testing:1.4.0-alpha09 已发布。版本 1.4.0-alpha09 包含这些提交。

新功能

  • 您现在可以调用 clearBackStack(name) 来清除之前用 saveBackStack(name) 保存的任何状态。(I70cd7

API 变更

  • FragmentContainerView 类已用 Kotlin 重写,确保 getFragment 函数能够正确尊重可空性。(If694ab/189629145
  • FragmentStrictMode 现在用 Kotlin 编写(I11767b/199183506

Bug 修复

  • 修复了在使用 setReorderingAllowed(true) 添加 fragment,然后在执行挂起事务之前立即移除该 fragment 时,状态未被正确清理的问题。(I8ccb8

版本 1.4.0-alpha08

2021 年 9 月 1 日

androidx.fragment:fragment:1.4.0-alpha08androidx.fragment:fragment-ktx:1.4.0-alpha08androidx.fragment:fragment-testing:1.4.0-alpha08 已发布。版本 1.4.0-alpha08 包含这些提交。

Bug 修复

  • 改进了 UseRequireInsteadOfGet Lint 检查,以更好地处理冗余括号。(I2d865
  • 改进了 UseGetLayoutInflater Lint 检查,以处理额外的边界情况。(Ie5423

版本 1.4.0-alpha07

2021 年 8 月 18 日

androidx.fragment:fragment:1.4.0-alpha07androidx.fragment:fragment-ktx:1.4.0-alpha07androidx.fragment:fragment-testing:1.4.0-alpha07 已发布,没有显著变化。版本 1.4.0-alpha07 包含这些提交。

版本 1.4.0-alpha06

2021 年 8 月 4 日

androidx.fragment:fragment:1.4.0-alpha06androidx.fragment:fragment-ktx:1.4.0-alpha06androidx.fragment:fragment-testing:1.4.0-alpha06 已发布。版本 1.4.0-alpha06 包含这些提交。

Bug 修复

  • 修复了在快速切换返回栈时,在恢复 FragmentTransaction 时表现为 IllegalStateException 或出现 fragment 的第二个副本的多重返回栈问题。(I9039f
  • 修复了 FragmentManager 在状态恢复后仍保留通过 saveBackStack() 保存的状态副本的问题。(Ied212
  • DialogFragmentdismissAllowingStateLoss() 方法在通过 show(FragmentTransaction, String) 方法专门添加 DialogFragment 后,在状态保存后调用时不再崩溃。(I84422

版本 1.4.0-alpha05

2021 年 7 月 21 日

androidx.fragment:fragment:1.4.0-alpha05androidx.fragment:fragment-ktx:1.4.0-alpha05androidx.fragment:fragment-testing:1.4.0-alpha05 已发布。版本 1.4.0-alpha05 包含这些提交。

Bug 修复

  • 摘自 Fragment 1.3.6:当根视图设置了 transitionGroup=”true” 时,使用 hide() 时 Fragment 的视图现在会正确设置为 GONE。(aosp/1766655b/193603427
  • 摘自 Fragment 1.3.6FragmentActivity 现在在它重写的生命周期回调中,总是将其作为第一个操作来解锁已保存的状态。(I6db7a

依赖项更新

版本 1.4.0-alpha04

2021 年 6 月 30 日

androidx.fragment:fragment:1.4.0-alpha04androidx.fragment:fragment-ktx:1.4.0-alpha04androidx.fragment:fragment-testing:1.4.0-alpha04 已发布。版本 1.4.0-alpha04 包含这些提交。

API 变更

  • FragmentManager 现在在内部使用 SavedStateRegistry 来保存其状态。FragmentController 中的 saveAllState()restoreSavedState() 方法也已被弃用。如果您正在使用 FragmentControllerFragmentActivity 之外托管 fragment,则应该让您的 FragmentHostCallbacks 实现 SavedStateRegistryOwner。(Iba68eb/188734238

Bug 修复

  • 修复了在同时运行使用 replace()FragmentTransaction 时,作为支持多重返回栈一部分的 saveBackStack() 调用失败的问题。(I73137
  • 修复了在使用 restoreBackStack() API 进行多重返回栈支持时,手动恢复包含多个事务的已保存返回栈后发生的 NullPointerException。这也修复了没有为所有事务检查 setReorderingAllowed(true) 的问题。(I8c593
  • 修复了 FragmentManager 即使在这些 fragment 从 FragmentManager 中移除后,仍错误地继续恢复已保存的 fragment 状态,从而导致保存的状态随着时间的推移不断增加的问题。(I1fb8e

版本 1.4.0-alpha03

2021 年 6 月 16 日

androidx.fragment:fragment:1.4.0-alpha03androidx.fragment:fragment-ktx:1.4.0-alpha03androidx.fragment:fragment-testing:1.4.0-alpha03 已发布。版本 1.4.0-alpha03 包含这些提交。

新功能

  • 所有 Fragment StrictMode Violation 类都已更新,并提供了更详细的错误消息,解释了违规的详细信息。(b/187871638
    • FragmentTagUsageViolation 现在包含更详细的错误消息,其中包含 fragment 本应被添加到其中的父容器。(Ic33a7
    • WrongFragmentContainerViolation 现在有更详细的错误消息,其中包含 fragment 被添加到的容器。(Ib55f8
    • TargetFragmentUsageViolation 的用例类现在有更详细的错误消息,包括导致违规的 fragment 和任何其他包含的信息。(Icc6ac
    • 扩展 RetainInstanceUsageViolation 的类现在有更详细的错误消息,包括导致违规的 fragment。(I6bd55
    • FragmentReuseViolation 现在有更详细的错误消息,包括 fragment 的前一个 id。(I28ce2
    • SetUserVisibleHintViolation 现在有更详细的错误消息,包括用户可见提示被设置为什么。(Ib2d5f

行为变更

  • 撤销了对在 FragmentContainerView 上调用 fitsSystemWindows 的限制 - 这不再导致您的应用崩溃。(6b8dddb/190622202

Bug 修复

  • 摘自 Fragment 1.3.5:修复了 Fragment 1.3.4 通过 aosp/1679887 引入的共享元素转换中的回归。Fragment 现在正确处理转换组(直接通过 transitionGroup="true" 设置或间接通过 transitionNamebackground 设置),并且共享元素不再抛出 IndexOutOfBoundsException。(I16484b/188679569b/188969304
  • FragmentManager 在您尝试隐藏正在移除的 fragment 时不再崩溃。(I573ddb/183634730
  • OnCreateDialogIncorrectCallback lint 检查在评估顶级变量时不再崩溃。(0a9efab/189967522

版本 1.4.0-alpha02

2021 年 6 月 2 日

androidx.fragment:fragment:1.4.0-alpha02androidx.fragment:fragment-ktx:1.4.0-alpha02androidx.fragment:fragment-testing:1.4.0-alpha02 已发布。版本 1.4.0-alpha02 包含这些提交。

新功能

  • FragmentStrictMode 现在总是会在通过 FragmentManager 启用日志记录时记录违规,无论正在使用当前的严格模式策略如何。(I02df6b/187872638
  • FragmentStrictMode 现在支持将特定的 Fragment 类免除严格模式 Violation,从而允许该类绕过任何惩罚。(Ib4e5db/184786736

  • FragmentStrictMode Violation 类已扩展,增加了基于每次违规的结构信息。这允许您验证到底是什么导致了违规,以及违规的 fragment(If5118b/187871150),每个 Violation 包含以下内容:

    • WrongFragmentContainerViolation 现在包含 Fragment 试图被添加到的 ViewGroup。(I83c75b/187871150
    • TargetFragmentUsageViolation 已扩展为 SetTargetFragmentUsageViolationGetTargetFragmentUsageViolationGetTargetFragmentRequestCodeUsageViolation,其中 SetTargetFragmentUsageViolation 包含目标 fragment 和请求代码。(I741b4b/187871150
    • SetUserVisibleHintViolation 现在包含传递给 setUserVisibleHint() 的布尔值。(I00585b/187871150
    • FragmentTagUsageViolation 现在包含 <fragment> 标签试图将 fragment 膨胀到的 ViewGroup。(I5dbbcb/187871150
    • FragmentReuseViolation 现在包含导致违规的 Fragment 前一个实例的唯一 ID。(I0544db/187871150
    • RetainInstanceUsageViolation 现在是抽象的,并且有两个子类 SetRetainInstanceUsageViolationGetRetainInstanceUsageViolation,分别表示违规类型的两种情况。(Ic81e5b/187871150

行为变更

  • FragmentContainerView 现在在尝试以编程方式或通过 XML 更改 fitsSystemWindow 属性时抛出异常。插入内容应由每个单独的 fragment 的视图处理。(Ie6651b/187304502

版本 1.4.0-alpha01

2021 年 5 月 18 日

androidx.fragment:fragment:1.4.0-alpha01androidx.fragment:fragment-ktx:1.4.0-alpha01androidx.fragment:fragment-testing:1.4.0-alpha01 已发布。版本 1.4.0-alpha01 包含这些提交。

新功能

  • FragmentContainerView 现在提供一个 getFragment() 方法,该方法返回最近添加到容器中的 fragment。它使用与 findFragmentById() 相同的逻辑,并带有 FragmentContainerView 的 ID,但允许链式调用。(Ife17ab/162527857

    val navController = binding.container.getFragment<NavHostFragment>().navController
    
  • 添加了 FragmentTransaction#TRANSIT_FRAGMENT_MATCH_ACTIVITY_{OPEN, CLOSE},用于指定是否在 fragment 转换中启用从主题中获取的标准 Activity 转换动画。(I46652

多重返回栈 (Multiple back stacks)

FragmentManager 维护一个返回栈,由使用 addToBackStack() 的 fragment 事务组成。这允许您弹出这些事务并返回到以前的状态,使用 使用 fragment 保存状态 的机制来允许 fragment 适当地恢复其状态。

此版本通过提供两个新的 FragmentManager API 扩展了这些机制:saveBackStack(String name)restoreBackStack(String name)。这些 API 使用与 addToBackStack() 相同的 name 来保存 FragmentTransaction 的状态以及在这些事务中添加的每个 fragment 的状态,并允许您稍后恢复这些事务及其 fragment,并保持其状态完整。这允许您通过保存当前的返回栈并恢复已保存的返回栈,有效地在多个返回栈之间“切换”。

saveBackStack() 的操作类似于 popBackStack(),因为它是异步的,并且会导致所有回到该特定名称的 fragment 事务被逆转(“弹出”),并且任何已添加的 fragment 都会被销毁和移除,但它在几个重要方面有所不同:

  • saveBackStack() 始终是包含性的。
  • popBackStack() 不同(如果未找到指定的名称或提供了空名称,它将弹出返回栈上的所有事务),如果您之前没有使用该精确的非空名称提交过使用 addToBackStack() 的 fragment 事务,saveBackStack() 将不会执行任何操作。
  • 保存从这些事务中添加的所有 fragment 的状态。这意味着每个 fragment 的视图状态都被存储,每个 fragment 的 onSaveInstanceState() 被调用并且该状态被恢复,并且与这些 fragment 关联的任何 ViewModel 实例都被保留(并且不会调用它们的 onCleared())。

可与 saveBackStack() 一起使用的 fragment 事务必须满足特定条件:

  • 每个 fragment 事务必须使用 setReorderingAllowed(true) 以确保事务可以作为单个原子操作恢复。
  • 保存的事务集必须是自包含的(即,它们不得显式引用该事务集之外的任何 fragment),以确保它们可以在以后的任何时间恢复,无论在此期间对返回栈做了哪些更改。
  • 任何保存的 fragment 不得是保留的 fragment,也不得在其子 fragment 的传递集中包含保留的 fragment,以确保在保存返回栈后 FragmentManager 不会返回对已保存 fragment 的任何引用。

saveBackStack() 类似,如果您之前没有使用相同的名称调用过 saveBackStack(),则 restoreBackStack() 不会执行任何操作。(b/80029773

Fragment StrictMode

FragmentStrictMode API 提供运行时检查,允许您验证您的应用或您所依赖的库是否没有调用已弃用的 fragment API。当检测到违规时,您可以选择打印日志消息、触发自定义监听器或让应用崩溃。控制启用哪些检查以及触发哪些“惩罚”的 FragmentStrictMode.Policy 可以通过新的 setStrictModePolicy() 方法在 FragmentManager 上设置。该策略适用于该 FragmentManager,并传递应用于任何未设置自己唯一策略的子 fragment 管理器。(#123#131#150b/143774122

  • detectFragmentReuse() 检测之前移除的 Fragment 实例是否正被重新添加到 FragmentManager 中。在 Fragment 实例被销毁并从 FragmentManager 中移除后,您绝不应与之交互或保留对它的引用。(#142b/153738653
  • detectFragmentTagUsage() 检测您何时在布局 XML 中使用 <fragment> 标签。在布局中包含 fragment 时,您应该始终使用 FragmentContainerView。(#141b/153738235
  • detectWrongFragmentContainer() 检测您何时将 fragment 添加到不是 FragmentContainerView 的容器中。在布局中,您应该始终使用 FragmentContainerView 作为 fragment 的容器。(#146b/181137036
  • detectRetainInstanceUsage() 检测您何时使用已弃用的 setRetainInstance()getRetainInstance() API。(#140b/153737954
  • detectSetUserVisibleHint() 检测您何时使用已弃用的 setUserVisibleHint() API。(#136b/153738974
  • detectTargetFragmentUsage() 检测您何时使用已弃用的 setTargetFragment()getTargetFragment()getTargetRequestCode() API。(#139b/153737745

API 变更

新的 Lint 检查

  • UseGetLayoutInflater Lint 检查现在会在 DialogFragment 内使用 LayoutInflater.from(Context) 时发出警告 - 您应该始终使用 dialog fragment 的 getLayoutInflater() 方法来获取适当的 LayoutInflater。(#156b/170781346
  • DialogFragmentCallbacksDetector Lint 检查现在会在 DialogFragmentonCreateDialog() 方法中调用 setOnCancelListenersetOnDismissListener 时发出警告 - 这些监听器由 DialogFragment 本身拥有,您应该重写 onCancel()onDismiss() 以接收这些回调。(#171b/181780047b/187524311

Bug 修复

  • 摘自 Fragment 1.3.4:修复了在 Fragment 内将 ViewTreeViewModelStoreOwner.get() API 与 ViewModelProvider 或 Jetpack Compose 的 viewModel() 方法一起使用时引入的回归。如果您的 Fragment 重写了 getDefaultViewModelProviderFactory()(正如使用 Hilt 时使用 @AndroidEntryPoint 注解的 Fragment 所做的那样),这些用例现在将正确使用您的 Fragment 提供的 ViewModelProvider.Factory。如果您没有重写该方法,则会创建一个与 Fragment 视图一起保存和恢复其状态的 SavedStateViewModelFactory 作为默认工厂。(I5cbfab/186097368
  • 摘自 Fragment 1.3.4:在 API 29 上使用 FragmentContainerView 时,插入内容将不再无限期地分发,修复了 BottomNavigationBarFloatingActionButton 实例的问题。(I1bb78b/186012452
  • 摘自 Fragment 1.3.4:您现在可以在进程销毁后从 fragment 结果包中检索您的 Parcelable。(I65932b/187443158
  • 摘自 Fragment 1.3.4:在 ViewGroup 上执行共享元素转换时,如果 ViewGroup 设置了 transitionGroup 为 false,它现在将正确转换。(I99675

外部贡献

版本 1.3

版本 1.3.6

2021 年 7 月 21 日

androidx.fragment:fragment:1.3.6androidx.fragment:fragment-ktx:1.3.6androidx.fragment:fragment-testing:1.3.6 已发布。版本 1.3.6 包含这些提交。

Bug 修复

  • 摘自 Fragment 1.4.0-alpha03FragmentManager 在您尝试隐藏正在移除的 fragment 时不再崩溃。(I573ddb/183634730
  • 当根视图设置了 transitionGroup=”true” 时,使用 hide() 时 Fragment 的视图现在会正确设置为 GONE。(aosp/1766655b/193603427
  • FragmentActivity 现在在它重写的生命周期回调中,总是将其作为第一个操作来解锁已保存的状态。(I6db7a

依赖项更新

版本 1.3.5

2021 年 6 月 16 日

androidx.fragment:fragment:1.3.5androidx.fragment:fragment-ktx:1.3.5androidx.fragment:fragment-testing:1.3.5 已发布。版本 1.3.5 包含这些提交。

Bug 修复

  • 修复了 Fragment 1.3.4 通过 aosp/1679887 引入的共享元素转换中的回归。Fragment 现在正确处理转换组(直接通过 transitionGroup="true" 设置或间接通过 transitionNamebackground 设置),并且共享元素不再抛出 IndexOutOfBoundsException。(I16484b/188679569b/188969304

版本 1.3.4

2021 年 5 月 18 日

androidx.fragment:fragment:1.3.4androidx.fragment:fragment-ktx:1.3.4androidx.fragment:fragment-testing:1.3.4 已发布。版本 1.3.4 包含这些提交。

Bug 修复

  • 修复了在 Fragment 内将 ViewTreeViewModelStoreOwner.get() API 与 ViewModelProvider 或 Jetpack Compose 的 viewModel() 方法一起使用(使用 Hilt 时)引入的回归。如果您的 Fragment 重写了 getDefaultViewModelProviderFactory()(正如 @AndroidEntryPoint 注解的 Fragment 所做的那样),这些用例现在将正确使用您的 Fragment 提供的 ViewModelProvider.Factory。如果您没有重写该方法,则会创建一个与 Fragment 视图一起保存和恢复其状态的 SavedStateViewModelFactory 作为默认工厂。(I5cbfab/186097368
  • 在 API 29 上使用 FragmentContainerView 时,插入内容将不再无限期地分发,修复了 BottomNavigationBarFloatingActionButton 实例的问题。(I1bb78b/186012452
  • 您现在可以在进程销毁后从 fragment 结果包中检索您的 Parcelable。(I65932b/187443158
  • 在 ViewGroup 上执行共享元素转换时,如果 ViewGroup 设置了 transitionGroup 为 false,它现在将正确转换。(I99675

版本 1.3.3

2021 年 4 月 21 日

androidx.fragment:fragment:1.3.3androidx.fragment:fragment-ktx:1.3.3androidx.fragment:fragment-testing:1.3.3 已发布。版本 1.3.3 包含这些提交。

新功能

  • 在使用通过 Fragment 视图使用 ViewTreeSavedStateRegistryOwner.get() 返回的 SavedStateRegistryOwner 时,使用 SavedStateViewModelFactory 现在可以正常工作。(I21acfb/181577191

Bug 修复

  • 修复了 Fragment 1.3.2 中引入的回归,该回归导致在弹出包含 setPrimaryNavFragment 操作(例如 NavHostFragment 使用的那些)的 FragmentTransaction 时,popEnter 动画无法运行。(I38c87b/183877426
  • FragmentContainerView 现在确保向每个 Fragment 分发一组新的 WindowInsets,确保每个 fragment 现在可以独立消耗插入内容。(I63f68b/172153900
  • DialogFragment 现在正确处理子 fragment 添加到具有与您自定义 Dialog 类中容器相同 ID 的容器中的情况,修复了重用被 BottomSheetDialog 等对话框在内部使用的 ID 时的视图层次结构问题。(Ie6279b/180021387
  • FragmentManager.dump() 现在正确缩进活动 fragment 列表中的第一个 fragment。(If5c33b/183705451

新状态管理器错误修复

  • 新的 fragment 状态管理器现在正确处理带有隐藏操作的退出转换。(I9e4deb/184830265

版本 1.3.2

2021 年 3 月 24 日

androidx.fragment:fragment:1.3.2androidx.fragment:fragment-ktx:1.3.2androidx.fragment:fragment-testing:1.3.2 已发布。版本 1.3.2 包含这些提交。

新状态管理器错误修复

  • 当同时运行 popBackStack()commit() 操作时,最后一个操作现在将设置所有动画的方向,而不是运行一些弹出动画和一些进入动画。(I7072eb/181142246
  • 在共享元素层次结构中的视图在执行共享元素转换时,将不再清除其转换名称。(I4d4a6b/179934757

依赖项更新

  • Fragment 现在依赖于 Activity 1.2.2,修复了在使用 Fragment 1.3.1 或更高版本时 Activity 的 InvalidFragmentVersionForActivityResult lint 检查的问题。
  • Fragment 现在依赖于 Lifecycle 2.3.1

版本 1.3.1

2021 年 3 月 10 日

androidx.fragment:fragment:1.3.1androidx.fragment:fragment-ktx:1.3.1androidx.fragment:fragment-testing:1.3.1 已发布。版本 1.3.1 包含这些提交。

新功能

  • DialogFragment 中的对话框现在可以通过其 DecorView 获取 ViewTree 所有者,从而确保 DialogFragment 可以与 ComposeView 一起使用。(Ib9290b/180691023

Bug 修复

  • 使用 FragmentContainerView 膨胀到已 RESUMED 的 activity 中的 Fragment,现在在配置更改后可以正确显示。(Ie14c8b/180538371
  • Fragment toString() 末尾不再有多余的 }。(I54705b/177761088
  • FragmentActivity 中重写的方法现在正确继承了基础方法 javaDoc。(I736ceb/139548782
  • setFragmentResultsetFragmentResultListener 的文档已更新其参数文档,以反映它们不再接受可空值。(I990bab/178348386

新状态管理器错误修复

  • 修复了由 mFocusedView 引起的 fragment 内存泄漏。(Ib4e9eb/179925887
  • Fragment 现在在使用显示/隐藏事务时正确调用 onCreateOptionsMenu。(I8bce8b/180255554
  • 在 fragment 布局前启动转换的子 fragment 现在将正确达到 RESUMED。(Ic11e6b/180825150
  • 使用 <fragment> 标签膨胀的 Fragment 现在将始终达到 RESUMED。(I452ac,(I9fa49

依赖项更新

版本 1.3.0

2021 年 2 月 10 日

androidx.fragment:fragment:1.3.0androidx.fragment:fragment-ktx:1.3.0androidx.fragment:fragment-testing:1.3.0 已发布。版本 1.3.0 包含这些提交。

自 1.2.0 以来的重大变化

  • 新的状态管理器:对 FragmentManager 内部的 重大重写 修复了围绕生命周期事件、动画和转换的分发以及如何处理延迟 fragment 的许多问题。
  • Activity Result API 集成:添加了对 Activity 1.2.0 中引入的 ActivityResultRegistry API 的支持,以处理 startActivityForResult()+onActivityResult() 以及 requestPermissions()+onRequestPermissionsResult() 流程,无需重写 Fragment 中的方法,此外还提供了测试这些流程的钩子。请参阅更新的 获取 Activity 结果

    • 此版本修复了围绕无效请求代码和权限请求分发的一些问题,这些问题阻止了 Activity Result API 在以前版本的 FragmentActivity 上工作。您必须升级到 Fragment 1.3.0 才能在 FragmentActivityAppCompatActivity 中使用 Activity Result API。
  • Fragment Result API:添加了对通过 FragmentManager 上的新 API 在两个 Fragment 之间传递结果的支持。这适用于层次结构 fragment(父/子)、DialogFragment 以及导航中的 fragment,并确保结果仅在 Fragment 至少处于 STARTED 状态时发送给它。目标 fragment API 已弃用,取而代之的是这些新 API。请参阅 使用 Fragment Result API 获取结果

  • FragmentOnAttachListenerFragmentActivityFragment 上的 onAttachFragment() 回调已被弃用。添加了一个新的 FragmentOnAttachListener 以提供更灵活的替代方案,允许将 onAttachFragment() 委托给单独的、可测试的监听器,并支持向除直接子 FragmentManager 之外的 FragmentManager 添加监听器。

  • FragmentScenario 改进:来自 fragment-testing 工件的 FragmentScenario 类已用 Kotlin 重写,并获得了一些改进:

    • FragmentScenario 现在使用 setMaxLifecycle() 来实现 moveToState(),确保在所有 API 级别上行为一致,并将 Fragment 的状态与底层 Activity 解耦。
    • FragmentScenario 现在支持设置初始 Lifecycle.State,以支持在第一次移动到每个 Lifecycle.State 之前断言 fragment 的状态。
    • 现在有一种 FragmentScenario API 的 onFragment 替代方案,即 Kotlin 具象化扩展方法 withFragment,它允许您返回一个值。值得注意的是,它会重新抛出在给定块中引发的异常。
  • ViewTree 支持Fragment 现在支持 Lifecycle 2.3.0SavedState 1.1.0 中添加的 ViewTreeLifecycleOwner.get(View)ViewTreeViewModelStoreOwner.get(View)ViewTreeSavedStateRegistryOwner API,因此当在 Fragment 中使用 View 时,它将返回该 Fragment 作为 ViewModelStoreOwner,以及绑定到 fragment 的 视图生命周期SavedStateRegistryOwnerLifecycleOwner

  • TRANSIT_ 动画更改:Fragment 默认效果 TRANSIT_FRAGMENT_OPENTRANSIT_FRAGMENT_CLOSETRANSIT_FRAGMENT_FADE 现在使用 Animator 而不是 Animation。用于构建这些动画器的资源现在是私有的。

  • setRetainInstance() 弃用:Fragment 上的 setRetainInstance() 方法已被弃用。随着 ViewModels 的引入,开发者有了一个特定的 API 来保留可以与 Activities、Fragments 和 Navigation 图关联的状态。这允许开发者使用正常的、非保留的 Fragment,并将他们想要保留的特定状态单独保留,避免了常见的泄漏来源,同时保持了单一创建和销毁保留状态(即 ViewModel 的构造函数和它接收的 onCleared() 回调)的有用属性。

  • ViewPager 1 适配器弃用:随着 ViewPager2 1.0.0 的发布,用于与 ViewPager 交互的 FragmentPagerAdapterFragmentStatePagerAdapter 类已被弃用。请参阅 从 ViewPager 迁移到 ViewPager2

版本 1.3.0-rc02

2021 年 1 月 27 日

androidx.fragment:fragment:1.3.0-rc02androidx.fragment:fragment-ktx:1.3.0-rc02androidx.fragment:fragment-testing:1.3.0-rc02 已发布。版本 1.3.0-rc02 包含这些提交。

Bug 修复

  • 修复了配置更改后父 DialogFragment 会出现在子 DialogFragment 之上的问题;子对话框 fragment 现在总是出现在父对话框 fragment 之上。(I30806b/177439520
  • 修复了使用 Animation 执行 hide 操作会导致隐藏的 fragment 在动画结束时闪烁的问题。(I57e22b/175417675
  • 在视图层次结构附加之前添加了转换的 Fragment 现在可以正确达到 RESUMED。(I1fc1db/177154873

新状态管理器错误修复

  • Fragment 的视图 Lifecycle 现在可以正确处理 Fragment 视图在 Lifecycle 达到 CREATED 之前被销毁的情况,避免了说明“no event down from INITIALIZED”的异常。(eda2bdb/176138645
  • 使用 Animator 的 Fragment 在使用 FragmentContainerView 时现在以正确的顺序出现。(Id9aa3b/176089197

版本 1.3.0-rc01

2020 年 12 月 16 日

androidx.fragment:fragment:1.3.0-rc01androidx.fragment:fragment-ktx:1.3.0-rc01androidx.fragment:fragment-testing:1.3.0-rc01 已发布。1.3.0-rc01 版本包含这些提交。

Bug 修复

  • onPrepareOptionsMenu() 现在遵循与 onCreateOptionsMenu() 相同的逻辑,当父 Fragment 调用 setMenuVisibility(false) 时,不再调用该方法。(Id7de8, b/173203654

新状态管理器错误修复

  • 修复了将带有 Animation 的 Fragment 添加到 FragmentContainerView,随后通过弹出(pop)操作中断该添加过程时出现的内存泄漏和视觉伪影。(I952d8
  • 修复了在 Fragment 的 onCreate()onViewCreated() 方法中替换 Fragment 时,其视图仍保留在视图层次结构中的问题。(I8a7d5
  • Fragment 根视图在恢复(resumed)时现在可以正确恢复焦点。(Ifc84b
  • 在同一个 Fragment 事务中组合使用弹出和替换操作时,现在将显示正确的动画。(Ifd4e4, b/170328691

版本 1.3.0-beta02

2020 年 12 月 2 日

androidx.fragment:fragment:1.3.0-beta02androidx.fragment:fragment-ktx:1.3.0-beta02androidx.fragment:fragment-testing:1.3.0-beta02 已发布。1.3.0-beta02 版本包含这些提交。

新功能

  • FragmentScenario 已完全转换为 Kotlin,同时通过使用 Kotlin 1.4 的 FragmentAction 函数式接口保持了源码和二进制兼容性。(I19d31

行为变更

  • 未使用 classandroid:name 属性扩充 Fragment 的 FragmentContainerView 现在可以在 FragmentActivity 之外使用。(Id4397, b/172266337
  • 尝试将 Fragment 的最大生命周期设置为 DESTROYED 时,现在会抛出 IllegalArgumentException。(Ie7651, b/170765622
  • 使用 DESTROYED 状态初始化 FragmentScenario 时,现在会抛出 IllegalArgumentException。(I73590, b/170765622

新状态管理器错误修复

  • 修复了在使用 AnimatorTRANSIT_FRAGMENT_ 选项之一中断 Fragment 过渡时,视图无法达到其最终状态的问题。(I92426, b/169874632
  • 修复了导致带有退出 Animation 的 Fragment 无法被正确销毁的问题。(I83d65
  • 反转效果的退出 Fragment 现在可以正确取消并使用正确的进入效果重新启动。(I62226, b/167092035
  • 修复了 hide() 操作的退出 Animator 不执行的问题。(Id7ffe
  • Fragment 在推迟后立即启动时,现在可以正确显示。(Ie713b, b/170022857
  • 在动画期间移除其焦点视图的 Fragment 在达到 RESUMED 状态后,不会再尝试恢复对已分离视图的焦点。(I38c65, b/172925703

外部贡献

  • FragmentFactory 现在为不同的 ClassLoader 实例分别缓存 Fragment 类。感谢 Simon Schiller!(#87, b/113886460

版本 1.3.0-beta01

2020 年 10 月 1 日

androidx.fragment:fragment:1.3.0-beta01androidx.fragment:fragment-ktx:1.3.0-beta01androidx.fragment:fragment-testing:1.3.0-beta01 已发布。1.3.0-beta01 版本包含这些提交。

新功能

  • setMaxLifecycle() 现在支持将 Lifecycle 状态设置为 INITIALIZING,只要 Fragment 尚未移动到 CREATED 状态即可。(b/159662173

API 变更

行为变更

  • Fragment 资源文件已正确设为私有。(aosp/1425237

Bug 修复

  • 使用 <fragment> 标签扩充的 Fragment 现在会在移动到 STARTED 之前,正确等待其视图被添加到容器中。(I02f4c
  • 可见且随后被 setMaxLifecycle() 设置为 CREATED 的 Fragment 现在可以正确运行其退出效果。(b/165822335
  • 移除未添加到回退栈的已分离 Fragment 不再导致内存泄漏。感谢 Nicklas Ansman Giertz!(b/166489383
  • 活跃的 Fragment 现在始终具有非 null 的 FragmentManager,并且具有非 null FragmentManager 的 Fragment 将始终被视为活跃。(aosp/1422346
  • Fragment 的默认效果 TRANSIT_FRAGMENT_OPENTRANSIT_FRAGMENT_CLOSETRANSIT_FRAGMENT_FADE 现在使用 Animator 而非 Animation。(b/166155034

新状态管理器错误修复

  • Fragment 现在可以正确地从其动画开始之前的位置恢复其视图焦点状态。(Icc256
  • 仅具有共享元素过渡的 Fragment 现在可以正确完成其特殊效果,这意味着它们实际上移动到了最终状态。(Iaebc7, b/166658128
  • Fragment 视图在被销毁之前,现在始终会从容器中移除。(Id5876
  • 新的状态管理器现在在添加进入的 Fragment 视图之前,始终会移除退出的 Fragment 视图。(I41a6e
  • 对 Fragment 视图可见性的显式更改现在会受到新状态管理器的尊重。这意味着,如果您在动画开始前将进入的 Fragment 视图设置为 INVISIBLE,它将保持不可见状态。(b/164481490
  • Fragment 现在优先处理 Animators 而非 Animations,这意味着同时拥有两者的 Fragment 将仅运行 Animator 并忽略 Animation。(b/167579557
  • 使用新的状态管理器时,不再会导致 Fragment 在使用进入动画时闪烁。(b/163084315

已知问题

使用新的状态管理器时,如果您在进入特殊效果期间按下返回键,旧的 Fragment 不会被重新添加,而是导致出现空白屏幕,而不是返回到上一个 Fragment。(b/167259187, b/167092035, b/168442830

版本 1.3.0-alpha08

2020 年 8 月 19 日

androidx.fragment:fragment:1.3.0-alpha08androidx.fragment:fragment-ktx:1.3.0-alpha08androidx.fragment:fragment-testing:1.3.0-alpha08 已发布。1.3.0-alpha08 版本包含这些提交。

新的状态管理器

此版本包含对 FragmentManager 内部状态管理的重大重构,这影响了生命周期方法、动画和过渡的调度,以及推迟事务的处理方式。此功能默认启用。有关详细信息,请参阅《Fragments:重建内部结构》博客文章。(b/139536619, b/147749580

  • FragmentManager.enableNewStateManager(boolean) 中的一个实验性 API 可用于控制 FragmentManager 是否使用新的状态管理器。(I7b6ee

以下问题仅在使用新的状态管理器时得到修复

  • replace 操作的上一个 Fragment 现在在新的 Fragment 启动之前被正确停止。(b/161654580
  • Fragment 现在防止在同一个 Fragment 上发生多个相互竞争的动画,从而避免了 Animation 会覆盖所有 Transition 效果,或者单个 Fragment 上的 AnimatorTransition 同时运行的情况。(b/149569323
  • 所有进入和退出的 Fragment 的 enterTransitionexitTranstion 现在都会运行,而不仅仅是最后一个进入的 Fragment 和第一个退出的 Fragment。(b/149344150
  • 推迟的 Fragment 不再卡在 CREATED 状态,而是与其他 Fragment 一起移动到 STARTED。(b/129035555
  • 修复了在混合使用推迟重新排序的事务和非重新排序的事务时,FragmentManager 会乱序执行操作的问题。(b/147297731
  • 在推迟 Fragment 时,同时弹出多个 Fragment 将不再导致中间的 Fragment 暂时可见。(b/37140383
  • FragmentManageronAttachFragment() 回调中调用 findFragmentById()findFragmentByTag() 时,现在会返回正确的 Fragment。(b/153082833
  • 当替换它们的 Fragment 被推迟时,Fragment 不再对正在销毁的 Fragment 调用 onCreateView()。(b/143915710
  • 尝试组合框架 Transition 和 AndroidX Transition 实例时的错误消息,现在会提及具有无效过渡的 Fragment。(b/155574969

行为变更

  • 您现在可以在 Fragment 的 onCreate() 生命周期方法中对 ActivityResultLauncher 调用 launch()。(b/161464278
  • onCreate() 之后调用 registerForActivityResult() 现在会抛出一个异常,表明这是不允许的,而不是在配置更改后静默失败而不交付结果。(b/162255449
  • FragmentActivity 现在使用在 Activity 1.2.0-alpha08 中引入的 OnContextAvailableListener API 来恢复 FragmentManager 的状态。添加到 FragmentActivity 子类的任何监听器都将在该监听器之后运行。(I513da

Bug 修复

  • 在使用 startIntentSenderForResult() 时传递的 ActivityOptions 现在受到尊重。(b/162247961

已知问题

  • 使用新的状态管理器时,在 onViewCreated() 之后和 onResume() 之前直接设置 Fragment 根视图的可见性,会导致您设置的可见性被控制根视图可见性的 FragmentManager 覆盖。作为变通方法,您应该始终使用 hide()show() 操作来更改 Fragment 的可见性。(b/164481490

版本 1.3.0-alpha07

2020 年 7 月 22 日

androidx.fragment:fragment:1.3.0-alpha07androidx.fragment:fragment-ktx:1.3.0-alpha07androidx.fragment:fragment-testing:1.3.0-alpha07 已发布。1.3.0-alpha07 版本包含这些提交。

新功能

  • FragmentScenario 现在支持将初始生命周期状态设置为 CREATEDSTARTEDRESUMED,而不是始终将 Fragment 移动到 RESUMED 状态。(b/159662750
  • 添加了 FragmentScenario API 中 onFragment 的替代方案,即 Kotlin 实化扩展方法 withFragment,它允许您返回一个值。值得注意的是,它会重新抛出在给定块中引发的异常。(b/158697631

行为变更

  • FragmentScenario 现在使用 setMaxLifecycle() 来实现 moveToState(),确保所有 API 级别上的行为一致,并将 Fragment 的状态与其底层 Activity 解耦。(b/156527405
  • ViewTreeSavedStateRegistryOwner 返回的 SavedStateRegistryOwner 现在绑定到 Fragment 视图的生命周期。这确保了它的状态保存和恢复与 Fragment 的视图同步。(b/158503763

Bug 修复

  • Fragment 现在会等待 Fragment 视图被附加后才调用 ViewCompat.requestApplyInsets(),避免了插入请求被丢弃的情况。(b/158095749
  • 调用 clearFragmentResultListener 现在可以正确清除生命周期观察者。(b/159274993

版本 1.3.0-alpha06

2020 年 6 月 10 日

androidx.fragment:fragment:1.3.0-alpha06androidx.fragment:fragment-ktx:1.3.0-alpha06androidx.fragment:fragment-testing:1.3.0-alpha06 已发布。1.3.0-alpha06 版本包含这些提交。

新功能

  • FragmentActivityFragment 上的 onAttachFragment() 回调已被弃用。添加了新的 FragmentOnAttachListener 以提供更灵活的替代方案,允许将 onAttachFragment() 委托给独立的、可测试的监听器,并支持将监听器添加到除直接子 FragmentManager 之外的 FragmentManager。(I06d3d

Bug 修复

  • 父 Fragment 现在在子 Fragment 之前恢复其视图状态,修复了当 DialogFragment 显示另一个 DialogFragment 作为子 Fragment 时,在配置更改后的视觉排序问题。(b/157195715
  • 修复了 UseRequireInsteadOfGet Lint 检查无法正确处理 ?.!! 运算符链式用法的问题。(b/157677616

版本 1.3.0-alpha05

2020 年 5 月 20 日

androidx.fragment:fragment:1.3.0-alpha05androidx.fragment:fragment-ktx:1.3.0-alpha05androidx.fragment:fragment-testing:1.3.0-alpha05 已发布。1.3.0-alpha05 版本包含这些提交。

新功能

API 变更

  • setFragmentResult()setFragmentResultListener() API 现在分别采用非 null 的 BundleFragmentResultListener。要显式清除之前设置的结果或监听器,请使用新的 clearFragmentResult()clearFragmentResultListener() 方法。(b/155416778
  • 采用 lambda 的 setFragmentResultListener() Kotlin 扩展现在被标记为 inline。(b/155323404

行为变更

  • Fragment 上之前已弃用的 startActivityForResult()startIntentSenderForResult()requestPermissions 现在内部使用 ActivityResultRegistry,从而在使用这些 API 时消除了对请求码仅使用低位(低于 0xFFFF)的限制。(b/155518741

文档更新

  • 扩展了关于 Fragment(@LayoutRes int)DialogFragment(@LayoutRes int) 构造函数的文档,以明确指出在使用默认 FragmentFactory 时,应从子类的无参构造函数中调用它们。(b/153042497

版本 1.3.0-alpha04

2020 年 4 月 29 日

androidx.fragment:fragment:1.3.0-alpha04androidx.fragment:fragment-ktx:1.3.0-alpha04androidx.fragment:fragment-testing:1.3.0-alpha04 已发布。1.3.0-alpha04 版本包含这些提交。

新功能

  • 增加了通过 FragmentManager 上的新 API 在两个 Fragment 之间传递结果的支持。这适用于层级 Fragment(父/子)、DialogFragment 以及 Navigation 中的 Fragment,并确保结果仅在您的 Fragment 至少处于 STARTED 状态时才发送给它。(b/149787344

API 变更

  • 目标 Fragment API 已被弃用。要在 Fragment 之间传递数据,应使用新的 Fragment Result API。(b/149787344
  • Fragment 上的 startActivityForResult()/onActivityResult()requestPermissions()/onRequestPermissionsResult() API 已被弃用。请使用 Activity Result API。(aosp/1290887
  • 来自 Activity 1.2.0-alpha04 的**重大变更**:prepareCall() 方法已重命名为 registerForActivityResult()。(aosp/1278717

Bug 修复

  • Fragment 的 getViewLifecycleOwner() 现在在调用 onSaveInstanceState() 之前停止,反映了 Fragment 生命周期行为。(b/154645875
  • 在 Fragment 上调用 setMenuVisibility(false) 现在可以正确更改其子 Fragment 提供的菜单的可见性。(b/153593580
  • 修复了将 Fragment 添加到 DialogFragment 的视图层次结构(使用 FragmentContainerView)时出现的 illegalStateException。(b/154366601
  • 在活动之外托管 Fragment 时,Fragment 上的 getDefaultViewModelProviderFactory() 方法不再崩溃。(b/153762914

版本 1.3.0-alpha03

2020 年 4 月 1 日

androidx.fragment:fragment:1.3.0-alpha03androidx.fragment:fragment-ktx:1.3.0-alpha03androidx.fragment:fragment-testing:1.3.0-alpha03 已发布。1.3.0-alpha03 版本包含这些提交。

API 变更

  • Fragment 上的 prepareCall 方法现在是 final 的。(b/152439361

Bug 修复

  • 修复了在使用 BottomSheetDialogFragment 时在 Fragment 1.3.0-alpha02 中引入的回归问题。(b/151652127, aosp/1263328, aosp/1265163
  • 修复了配置更改后从 Fragment 使用 prepareCall 时的崩溃问题。(b/152137004
  • 修复了在使用 setTargetFragment() 时忽略共享元素和退出过渡的问题。(b/152023196
  • 来自 Fragment 1.2.4:更新了 Fragment ProGuard 规则,允许混淆保留的 Fragment。(b/151605338
  • 来自 Fragment 1.2.4:禁用了 DialogFragment 类上的 FragmentLiveDataObserve Lint 规则,因为它们的生命周期和视图生命周期始终同步,使得调用 observe 时使用 thisviewLifecycleOwner 都是安全的。(b/151765086

依赖项变更

  • Fragment 依赖于 Activity 1.2.0-alpha03,该版本对 Activity 1.2.0-alpha02 中引入的 Activity Result API 进行了重大改进。

版本 1.3.0-alpha02

2020 年 3 月 18 日

androidx.fragment:fragment:1.3.0-alpha02androidx.fragment:fragment-ktx:1.3.0-alpha02androidx.fragment:fragment-testing:1.3.0-alpha02 已发布。1.3.0-alpha02 版本包含这些提交。

新功能

  • 添加了对 Activity 1.2.0-alpha02 中引入的 ActivityResultRegistry API 的支持,以处理 startActivityForResult()+onActivityResult() 以及 requestPermissions()+onRequestPermissionsResult() 流程,而无需覆盖 Fragment 中的方法,并提供了用于测试这些流程的钩子。请参阅更新后的《从 Activity 获取结果》。(b/125158199

API 变更

  • DialogFragment 现在提供了一个带有 @LayoutRes 的构造函数,该参数指示 onCreateView() 默认应扩充的布局。(b/150327080
  • onActivityCreated() 方法现在已被弃用。触及 Fragment 视图的代码应在 onViewCreated()(在 onActivityCreated() 之前立即调用)中完成,其他初始化代码应在 onCreate() 中。要在活动 onCreate() 完成时专门接收回调,应在 onAttach() 中向活动的 Lifecycle 注册一个 LifeCycleObserver,并在收到 onCreate() 回调后移除。(b/144309266

Bug 修复

  • 来自 Fragment 1.2.3:修复了 DialogFragment 中的一个错误,该错误导致在 onCreateDialog() 中调用 getLayoutInflater() 时出现 StackOverflowError。(b/117894767, aosp/1258664
  • 来自 Fragment 1.2.3:缩小了 Fragment 包含的 ProGuard 规则范围,以确保可以剥离未使用的 Fragment 类。(b/149665169
  • 来自 Fragment 1.2.3:修复了在使用遮蔽 Kotlin 属性名称的局部变量名称时,UseRequireInsteadOfGet Lint 检查中的误报。(b/149891163
  • 来自 Fragment 1.2.3FragmentContainerView 不再因为在布局预览中使用错误的构造函数而抛出 UnsupportedOperationException。(b/149707833

已知问题

  • BottomSheetDialogFragment 不再正确地在屏幕上定位其对话框。(b/151652127

版本 1.3.0-alpha01

2020 年 3 月 4 日

androidx.fragment:fragment:1.3.0-alpha01androidx.fragment:fragment-ktx:1.3.0-alpha01androidx.fragment:fragment-testing:1.3.0-alpha01 已发布。1.3.0-alpha01 版本包含这些提交。

新功能

API 变更

  • Fragment 上的 setRetainInstance() 方法已被弃用。随着 ViewModel 的引入,开发人员拥有了特定的 API 来保留可以与 Activity、Fragment 和 Navigation 图相关联的状态。这允许开发人员使用常规的、非保留的 Fragment,并将他们希望保留的特定状态分开,避免了常见的泄漏源,同时保持了单一创建和销毁保留状态的有用属性(即 ViewModel 的构造函数和它收到的 onCleared() 回调)。(b/143911815
  • 随着 ViewPager2 1.0.0 的发布,用于与 ViewPager 交互的 FragmentPagerAdapterFragmentStatePagerAdapter 类已被弃用。请参阅《从 ViewPager 迁移到 ViewPager2》。(b/145132715

Bug 修复

  • Fragment ProGuard 规则现在正确地仅保留所使用的 Fragment 类的默认构造函数,而不是所有 Fragment 实例,修复了在 Fragment 1.2.1 中引入的回归问题。(b/149665169
  • Fragment 1.2.2 中添加的 require___() Lint 规则不再对共享与被遮蔽的 Kotlin 属性名称(即 view)相同名称的局部变量产生误报。(b/149891163
  • FragmentContainerView 不再在 Android Studio 的布局预览中使用时抛出 UnsupportedOperationException。(b/149707833
  • 修复了在保存状态后添加的保留 Fragment 在每次配置更改后不会持续重新创建和销毁的问题。(b/145832397

1.2.5 版本

1.2.5 版本

2020 年 6 月 10 日

androidx.fragment:fragment:1.2.5androidx.fragment:fragment-ktx:1.2.5androidx.fragment:fragment-testing:1.2.5 已发布。1.2.5 版本包含这些提交。

Bug 修复

  • Fragment 的 getViewLifecycleOwner() 现在在调用 onSaveInstanceState() 之前停止,反映了 Fragment 生命周期行为。这之前已在 Fragment 1.3.0-alpha04 中发布。(b/154645875
  • 在 Fragment 上调用 setMenuVisibility(false) 现在可以正确更改其子 Fragment 提供的菜单的可见性。这之前已在 Fragment 1.3.0-alpha04 中发布。(b/153593580

1.2.4 版本

1.2.4 版本

2020 年 4 月 1 日

androidx.fragment:fragment:1.2.4androidx.fragment:fragment-ktx:1.2.4androidx.fragment:fragment-testing:1.2.4 已发布。1.2.4 版本包含这些提交。

Bug 修复

  • 更新了 Fragment ProGuard 规则,允许混淆保留的 Fragment。(b/151605338
  • 禁用了 DialogFragment 类上的 FragmentLiveDataObserve Lint 规则,因为它们的生命周期和视图生命周期始终同步,使得调用 observe 时使用 thisviewLifecycleOwner 都是安全的。(b/151765086

1.2.3 版本

1.2.3 版本

2020 年 3 月 18 日

androidx.fragment:fragment:1.2.3androidx.fragment:fragment-ktx:1.2.3androidx.fragment:fragment-testing:1.2.3 已发布。1.2.3 版本包含这些提交。

Bug 修复

  • 修复了 DialogFragment 中的一个错误,该错误导致在 onCreateDialog() 中调用 getLayoutInflater() 时出现 StackOverflowError。(b/117894767, aosp/1258665
  • 缩小了 Fragment 包含的 ProGuard 规则范围,以确保可以剥离未使用的 Fragment 类。(b/149665169
  • 修复了在使用遮蔽 Kotlin 属性名称的局部变量名称时,UseRequireInsteadOfGet Lint 检查中的误报。(b/149891163
  • FragmentContainerView 不再因为在布局预览中使用错误的构造函数而抛出 UnsupportedOperationException。(b/149707833

1.2.2 版本

1.2.2 版本

2020 年 2 月 19 日

androidx.fragment:fragment:1.2.2androidx.fragment:fragment-ktx:1.2.2androidx.fragment:fragment-testing:1.2.2 已发布。1.2.2 版本包含这些提交。

新的 Lint 检查

  • Lint 建议在 onCreateView()onViewCreated()onActivityCreated() 中向 OnBackPressedDispatcher 调用时,使用 viewLifecycleOwner 作为 LifecycleOwner。(b/142117657
  • 添加了一个新的 Lint 检查,确认在使用 fragment-testing 工件时,使用了正确的 debugImplementation。(b/141500106
  • Fragment 现在建议对所有包含 getrequire 等价 API 的 Fragment API,使用相关的 require___() 方法来获取更具描述性的错误消息,而不是使用 checkNotNull(get___())requireNonNull(get___())get___()!!。(aosp/1202883

Bug 修复

  • 修复了 Fragment ProGuard 文件以避免 R8 警告(b/148963981
  • 改进了现有的 Lint 检查,建议在调用 observe 时使用 viewLifecycleOwner,以同时处理 livedata-ktx 扩展方法版本的 observe。(b/148996309
  • 修复了许多 Lint 检查的格式(aosp/1157012

外部贡献

  • 感谢 Zac Sweers 代表 Slack 贡献 require___() Lint 检查!(aosp/1202883

版本 1.2.1

版本 1.2.1

2020 年 2 月 5 日

androidx.fragment:fragment:1.2.1androidx.fragment:fragment-ktx:1.2.1androidx.fragment:fragment-testing:1.2.1 已发布。1.2.1 版本包含这些提交

错误修复

  • 通过采用 Class 实例(或 Kotlin 实化版本)的 addreplace 方法添加的 Fragment,现在其默认构造函数会被 ProGuard 保留。(b/148181315
  • FragmentStatePagerAdapterFragmentPagerAdapter 不再捕获在运行 finishUpdate() 时由 FragmentManager 抛出的异常。(aosp/1208711
  • 修复了 FragmentManager.findFragment() 不适用于通过 <fragment> 标签添加的 Fragment 的问题。(b/147784323
  • 使用 <fragment> 标签扩充的 Fragment 现在在布局中时,始终会在 onCreate() 之前接收对 onInflate() 的调用。(aosp/1215856
  • 当 Activity 已经销毁时,在 FragmentManager 实例上调用 toString() 不再抛出 NullPointerException。(b/148189412

依赖关系变更

版本 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 以来的重要更改

  • FragmentContainerViewFragmentContainerView 是强烈推荐用于动态添加 Fragment 的容器,取代了 FrameLayout 或其他布局的使用。它还支持与 <fragment> 标签相同的 classandroid:name 和可选的 android:tag,但使用常规的 FragmentTransaction 来添加此初始 Fragment,而不是使用 <fragment> 使用的自定义代码路径。
  • onDestroyView() 时机:Fragment 现在等待退出动画、退出框架过渡和退出 AndroidX 过渡(使用 Transition 1.3.0 时)完成,然后再调用 onDestroyView()
  • 基于类的 add()replace():在 FragmentTransaction 上添加了 add()replace() 的新重载,它们采用 Class<? extends Fragment> 和可选的参数 Bundle。这些方法使用您的 FragmentFactory 来构造要添加的 Fragment 实例。使用实化类型的 Kotlin 扩展(例如 fragmentTransaction.replace<YourFragment>(R.id.container))也已添加到 fragment-ktx 中。
  • 生命周期 ViewModel SavedState 集成SavedStateViewModelFactory 现在是使用 by viewModels()by activityViewModels()ViewModelProvider 构造函数或带有 Fragment 的 ViewModelProviders.of() 时的默认工厂。
  • 新的 Lint 检查:添加了一个新的 Lint 检查,确保您在从 onCreateView()onViewCreated()onActivityCreated() 观察 LiveData 时使用 getViewLifecycleOwner()
  • getFragmentManager() 弃用:Fragment 上的 getFragmentManager()requireFragmentManager() 方法已被弃用,并替换为单个 getParentFragmentManager() 方法,该方法返回 Fragment 添加到的非 null FragmentManager(您可以使用 isAdded() 来确定调用是否安全)。
  • FragmentManager.enableDebugLogging() 弃用:静态 FragmentManager.enableDebugLogging 方法已被弃用。FragmentManager 现在尊重标记为 FragmentManagerLog.isLoggable(),允许您启用 DEBUGVERBOSE 日志记录,而无需重新编译您的应用。

已知问题

  • 仅通过 FragmentContainerView 上的 classandroid:name 属性引用的 Fragment 不会自动被 ProGuard 保留,需要您为每个 Fragment 类手动添加 keep 规则。(b/142601969
  • 当使用 FragmentContainerView 在 XML 中使用 classandroid:name 添加 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 1.2.0-rc04 中使用 <fragment> 标签时导致的在 Activity 销毁期间错误调用 onViewCreated() 的回归问题。(b/146290333
  • 使用 <fragment> 标签添加的 Fragment 现在即使仅在有时存在于布局中时(例如,仅在横向布局中),也能正确清除其非配置状态。因此,这些 Fragment 现在即使不在您的布局中也会正确移动到 CREATED,而不是在被实例化但从未通过任何生命周期方法。(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 的退出动画/过渡运行期间,已移除的 Fragment 仍由 findFragmentById() / findFragmentByTag() 返回。(b/143982969, aosp/1167585
  • 当包含的 Activity 调用 onSaveInstanceState() 时,子 Fragment 现在在父 Fragment 之前被正确停止。(b/144380645
  • 修复了在弹出隐藏的 Fragment 后视图被错误地标记为 INVISIBLE 的问题。(b/70793925
  • Fragment 共享元素过渡现在处理已旋转、缩放等的视图。(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 版本包含这些提交

新功能

  • FragmentContainerView 现在支持 class 属性以及 android:name,反映了 <fragment> 标签的功能。(b/142722242
  • 添加了一个新的 Lint 检查,确保您在从 onCreateView()onViewCreated()onActivityCreated() 观察 LiveData 时使用 getViewLifecycleOwner()。(b/137122478

错误修复

  • DialogFragment 上的 onDismissonCancel 回调现在保证传递给它们的 DialogInterface 是非 null 的,并且在执行它们时 getDialog() 返回非 null。(b/141974033
  • FragmentContainerView 现在将通过 classandroid:name 定义的 Fragment 作为扩充的一部分添加,确保 findFragmentById()findFragmentByTag() 在此之后立即生效。(b/142520327
  • 修复了 FragmentContainerView 中由于状态保存而导致的 IllegalStateException。(b/142580713
  • 修复了 FragmentContainerView 类被混淆时在 FragmentContainerView 中抛出的 UnsupportedOperationException。(b/142657034

已知问题

  • 仅通过 FragmentContainerView 上的 classandroid:name 属性引用的 Fragment 不会自动被 ProGuard 保留,需要您为每个 Fragment 类手动添加 keep 规则。我们已禁用建议移动到 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 操作,并使布局能够使用 View Binding。(b/139830628, b/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 现在是 final 的。(b/140133091

错误修复

  • 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 构造函数或带有 FragmentViewModelProviders.of() 时的默认工厂。(b/135716331
  • FragmentTransaction 上使用 setTransition 时,使用 TRANSIT_FRAGMENT_OPENTRANSIT_FRAGMENT_CLOSETRANSIT_FRAGMENT_FADE 时的默认动画已更新,以匹配 Android 10 设备上 Activity 使用的动画。(aosp/1012812, aosp/1014730

API 变更

  • 引入了 FragmentContainerView 作为强烈推荐用于动态添加 Fragment 的容器,取代了 FrameLayout 等的使用,因为它修复了动画 z-ordering 问题和调度到 Fragment 的窗口插入。(b/37036000, aosp/985243, b/136494650
  • 添加了一个静态 FragmentManager.findFragment(View) 方法,用于从由 Fragment 扩充的视图中检索包含的 Fragment。Kotlin 扩展也可在 fragment-ktx 中使用。(aosp/1090757
  • FragmentTransaction 上添加了 add()replace() 的新重载,它们采用 Class<? extends Fragment> 和可选的参数 Bundle。这些方法使用您的 FragmentFactory 来构造要添加的 Fragment 实例。使用实化类型的 Kotlin 扩展(例如 fragmentTransaction.replace<YourFragment>(R.id.container))也已添加到 fragment-ktx 中。(b/126124987
  • @MainThread 注解已添加到 Fragment 生命周期回调中。(b/127272564
  • FragmentTransactionFragmentManager.BackStackEntry 上与面包屑标题相关的 API 已弃用。(b/138252944)
  • FragmentTransaction 上的 setTransitionStyle 方法已弃用。(aosp/1011537)
  • FragmentManager 中的许多方法不再是 abstract(抽象)方法。FragmentManager 本身仍为 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)
  • 修复了在使用共享元素转换并结合弹出 (pop) 和添加 (add) 操作时出现的 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(),确保您的视图始终具有正确的内边距 (insets)。(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 实例的创建,从而消除了必须拥有无参构造函数的严格要求。
  • ViewModels 的 Kotlin 属性委托fragment-ktx 工件现在包含两个 Kotlin 属性委托:用于访问与单个 Fragment 关联的 ViewModel 的 by viewModels(),以及用于访问作用域限定为 Activity 的 ViewModel 的 by activityViewModels()
  • 最大生命周期 (Max Lifecycle):您现在可以通过在 FragmentTransaction 上调用 setMaxLifecycle() 来设置 Fragment 的最大生命周期状态。这取代了现已弃用的 setUserVisibleHint()FragmentPagerAdapterFragmentStatePagerAdapter 提供了新的构造函数,允许您切换到此新行为。
  • FragmentActivity 布局 ID 构造函数FragmentActivity 的子类现在可以选择调用一个接受 R.layout ID 的 FragmentActivity 构造函数,该 ID 表示应被设置为内容视图的布局,作为在 onCreate() 中调用 setContentView() 的替代方法。这不会改变您的子类必须拥有无参构造函数的要求。
  • Fragment 布局 ID 构造函数Fragment 的子类现在可以选择调用一个接受 R.layout ID 的 Fragment 构造函数,该 ID 表示应为此 Fragment 使用的布局,作为覆盖 onCreateView() 的替代方法。可以在 onViewCreated() 中配置扩充后的布局。
  • 带超时的延迟处理 (Postpone with a timeout):添加了一个新的 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 已发布。此版本包含的提交记录可以在此处找到。

此版本与 Preferences 1.1.0-alpha01 到 1.1.0-alpha04 不兼容。使用此版本的 Fragment 时,请升级到 Preferences 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 在达到最终状态之前不再会被恢复 (resumed)。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) 的结果,后台堆栈上的 Fragment 在宿主 Activity 重新创建时将不会收到 onCreateView() 的回调。onCreateView() 现在仅在 Fragment 变得可见(即弹出后台堆栈)时才会被调用。

错误修复

  • 修复了在使用 XML 中的 <fragment> 标签以及 FragmentActivityAppCompatActivitycontentLayoutId 构造函数时出现的问题。(b/129907905)
  • 纠正了一个问题,即后台堆栈上的 Fragment 在配置更改后不会至少移动到 CREATED 状态,导致 ViewModel 和保留的子 Fragment 无法正确处理。(b/129593351)
  • 修复了由于保存实例状态后保留的 Fragment 不同步而导致的 restoreSaveState 崩溃问题。(b/130433793) (aosp/947824)
  • 修复了添加了 Fragment 生命周期支持的 OnBackPressedCallbackFragmentManager 拥有后台堆栈时不会被调用的问题。有关更多详细信息,请参阅 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)
  • FragmentActivityonActivityResult() 现在已被正确标记为 @CallSuper。(b/127971684)
  • FragmentFactory 中接受参数 Bundle 的 instantiate 方法已被弃用,应用应使用新的不带 Bundle 的 instantiate 重载方法。(b/128836103)
  • FragmentScenario 方法现在已正确标注为 @StyleRes。(aosp/924193)
  • FragmentTabHost 已弃用。(b/127971835)
  • FragmentActivitygetThemedContext() 已被移除。(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 已发布。此版本包含的完整提交记录可以在此处找到。

新功能

  • @ContentView 注解查找现在已缓存 (b/123709449)

行为变更

  • 对附加到不同 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)
  • 您现在可以在 FragmentScenario 中使用 openActionBarOverflowOrOptionsMenu 来测试 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)

错误修复

  • 当您向 setTargetFragment() 传递 null 时,目标 Fragment 会被正确清除。(aosp/849969)
  • 修复了目标 Fragment 有时在 onDestroy() 中或之后不可用的问题。(b/122312935)
  • DialogFragmentonDismiss() 现在会在 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: Failure saving state b/120814739
  • 从保存的实例状态恢复的 Fragment 现在将始终收到一个非空的 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 工件和 FragmentScenario 的首次发布,它们构建在 androidx.test:core API 之上。有关更多详细信息,请参阅 Fragment 测试文档

新功能

  • 用于隔离测试 Fragment 的新 FragmentScenario 类。
  • 您现在可以在任何 FragmentManager 上设置 FragmentFactory,以控制如何实例化新的 Fragment 实例。
  • 添加了一个用于从 Fragment 检索 ViewModel 的新 by viewModels() Kotlin 属性委托。
  • 待处理的输入事件(例如点击)现在会在 Fragment 的 onStop() 中取消。

API 变更

  • 显著扩展了整个 Fragment API 表面中的空值注解。

错误修复

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

已知问题

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