Fragment

将您的应用分段为多个独立屏幕,这些屏幕托管在 Activity 中。
最新更新 稳定版发布 候选版本 Beta 版发布 Alpha 版发布
2025 年 6 月 4 日 1.8.8 - - -

声明依赖项

要添加对 Fragment 的依赖项,您必须将 Google Maven 代码库添加到您的项目中。请阅读Google 的 Maven 代码库了解更多信息。

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

Groovy

dependencies {
    def fragment_version = "1.8.8"

    // 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.8"

    // 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.8

版本 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 时出现“No view found for id”问题。( I94608)
  • 通过接受 ViewGroupFragmentTransaction.add 方法添加的 Fragment 现在会等待 onContainerAvailable,然后才继续进入 onStart()。这会影响该 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:修复了一个错误,即如果将不可寻道的共享元素添加到所有其他过渡都可寻道的事务中,则会发生崩溃。现在,该事务将正确地被视为不可寻道。( 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 包含这些提交

预测性返回手势支持

  • 使用 AnimatorAndroidX Transition 1.5.0 时,Fragment 现在支持预测性应用内返回。这允许用户在决定通过完成手势提交事务或取消之前,通过寻道 Animator/Transition 来查看上一个 Fragment。
过渡系统 XML 资源 支持预测性返回
动画 R.anim
动画器 R.animator
框架 Transition R.transition
AndroidX TransitionTransition 1.4.1 或更低版本 R.transition
AndroidX TransitionTransition 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)
  • 修复了一个错误,即如果将不可寻道的共享元素添加到所有其他过渡都可寻道的事务中,则会发生崩溃。现在,该事务将正确地被视为不可寻道。( 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)会导致 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 修复

  • 修复了由于设置共享元素过渡而未能同时设置进入/退出过渡导致的 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 包含这些提交。

新功能

  • Fragments 现在在使用 Androidx Transitions 时提供预测性返回支持。这允许您使用返回手势通过自定义 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 修复

  • 修复了当使用 API 34 的预测性返回手势时,Fragment 中的问题,该问题导致 Fragment 管理器返回栈中的第一个 Fragment 被跳过,并且在使用三按钮导航或预测性返回手势通过系统返回时 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 已发布。此版本是在内部分支中开发的。

新功能

  • Fragment 现在在使用 Animator 时提供预测性应用内返回支持。这允许您使用返回手势通过自定义 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 状态也是如此。如果该 Fragment 实例在使用多个返回栈 API 保存和恢复该 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 嵌套在其父 Fragment 的 View 层次结构中但未添加到父 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 中在同一帧中保存和恢复可能导致崩溃的错误。( 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 中调用 clearFragmentResultListenerLifecycle 已经 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 嵌套在其父 Fragment 的 View 层次结构中但未添加到父 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 始终获得正确的 callbacks。( 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 中调用 clearFragmentResultListenerLifecycle 已经 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 APIs 设置但尚未传递的结果现在与 FragmentManager 的内部状态分开保存。
    • 与每个独立 Fragment 相关联的状态现在与 FragmentManager 的内部状态分开保存,因此您可以将与独立 Fragment 相关联的已保存状态量与 Fragment 调试日志中存在的唯一 ID 相关联。

其他更改

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

版本 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 应使用这些 API。( I50a59, I20758)

Bug 修复

  • SavedStateViewFactory 现在支持使用 CreationExtras,即使它已使用 SavedStateRegistryOwner 初始化。如果提供了 extras,则忽略初始化的参数。( I6c43b, b/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() 函数。( Ibefe7, b/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 现在通过使用带有类名的 allowViolation(),允许私有第三方 Fragment 绕过特定的违规处罚。( 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版本 1.5.0-alpha01 包含这些提交。

新功能

  • Fragment 现在与 Lifecycle 2.5.0-alpha01 中引入的 ViewModel CreationExtras 集成。( I3060b, b/207012585)

Bug 修复

  • 来自 Fragment 1.4.1:当从 XML 生成的视图 ID 具有负值时,FragmentContainerView 不再抛出非法状态异常。( Ic185b, b/213086140)
  • 来自 Fragment 1.4.1:当将自定义 ownerProducer lambda 与 by viewModels() 延迟函数一起使用时,如果未提供自定义 ViewModelProvider.Factory,它现在将使用该所有者的 defaultViewModelProviderFactory,而不是始终使用 Fragment 的 factory。( I56170, b/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 修复

  • 当从 XML 生成的视图 ID 具有负值时,FragmentContainerView 不再抛出非法状态异常。( Ic185b, b/213086140)
  • 当将自定义 ownerProducer lambda 与 by viewModels() 延迟函数一起使用时,如果未提供自定义 ViewModelProvider.Factory,它现在将使用该所有者的 defaultViewModelProviderFactory,而不是始终使用 Fragment 的 factory。( I56170, b/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。这与使用 FragmentContainerView 的 ID 的 findFragmentById() 采用相同的逻辑,但允许链式调用。

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

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

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

多个返回栈

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() 不同,如果在返回栈中找不到指定的名称或提供了空名称,它将弹出返回栈上的**所有**事务,而 saveBackStack() 如果您之前没有使用该确切的非空名称提交过 Fragment 事务,则不执行任何操作。
  • 从这些事务添加的所有 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() 事件分派下去。( Iedc20, b/77504618)
  • 当从一个键盘打开的 Fragment 切换到另一个包含 RecyclerView 的 Fragment 时,键盘现在会自动关闭。( I8b842, b/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/1832956, b/200867930)
  • 添加了 FragmentAddMenuProvider lint 错误,用于在使用 MenuHostaddMenuProvider API 时,将 Fragment 生命周期更正为 Fragment 视图生命周期。( aosp/1830457, b/200326272)

文档更新

  • 现在由 Activity Result API 处理的 API(即 startActivityForResultstartIntentSenderForResultonActivityResultrequestPermissionsonRequestPermissionsResult)的弃用消息都已扩展,包含更多详细信息。( 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 函数将正确尊重可空性。( If694a, b/189629145)
  • FragmentStrictMode 现在用 Kotlin 编写 ( I11767, b/199183506)

Bug 修复

  • 修复了一个问题,即使用 setReorderingAllowed(true) 添加的 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 或出现 Fragment 的第二个副本时,可能会出现 IllegalStateException。( 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/1766655, b/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。( Iba68e, b/188734238)

Bug 修复

  • 修复了支持多个返回栈的一部分 saveBackStack() 调用在与使用 replace()FragmentTransaction 同时执行时会失败的问题。( I73137)
  • 修复了在使用 restoreBackStack() API 支持多个返回栈时,手动恢复包含多个事务的已保存返回栈后可能发生的 NullPointerException。这还修复了未检查所有事务的 setReorderingAllowed(true) 的问题。( I8c593)
  • 修复了一个问题,即 FragmentManager 会错误地继续恢复 Fragment 以前保存的状态,即使这些 Fragment 已从 FragmentManager 中移除,从而导致保存的状态随时间不断增长。( 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 的限制 — 这不再导致您的应用崩溃。( 6b8ddd, b/190622202)

Bug 修复

  • 来自 Fragment 1.3.5:修复了 aosp/1679887Fragment 1.3.4 中引入的共享元素过渡的回归。Fragment 现在正确处理过渡组(通过 transitionGroup="true" 直接设置或通过 transitionNamebackground 间接设置)并且共享元素将不再抛出 IndexOutOfBoundsException。( I16484, b/188679569, b/188969304)
  • 当您尝试隐藏一个正在移除的 Fragment 时,FragmentManager 将不再崩溃。( I573dd, b/183634730)
  • OnCreateDialogIncorrectCallback lint 检查在评估顶级变量时将不再崩溃。( 0a9efa, b/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 包含这些提交。

新功能

  • 当通过 FragmentManager 启用日志记录时,无论当前使用的严格模式策略如何,FragmentStrictMode 现在都会始终记录违规。( I02df6, b/187872638)
  • FragmentStrictMode 现在支持将特定的 Fragment 类从严格模式 Violation 中豁免,允许该类绕过任何处罚。( Ib4e5d, b/184786736)

  • FragmentStrictMode Violation 类已扩展,以根据每个违规添加结构信息。这允许您验证导致违规的确切原因以及违规的 Fragment ( If5118, b/187871150),每个 Violation 包含以下内容:

    • WrongFragmentContainerViolation 现在包含 Fragment 尝试添加到的 ViewGroup。( I83c75, b/187871150)
    • TargetFragmentUsageViolation 已扩展为 SetTargetFragmentUsageViolationGetTargetFragmentUsageViolationGetTargetFragmentRequestCodeUsageViolation,其中 SetTargetFragmentUsageViolation 包含目标 Fragment 和请求代码。( I741b4, b/187871150)
    • SetUserVisibleHintViolation 现在包含传递给 setUserVisibleHint() 的布尔值。( I00585, b/187871150)
    • FragmentTagUsageViolation 现在包含 <fragment> 标签尝试将 Fragment 膨胀到的 ViewGroup。( I5dbbc, b/187871150)
    • FragmentReuseViolation 现在包含导致违规的 Fragment 实例的前一个唯一 ID。( I0544d, b/187871150)
    • RetainInstanceUsageViolation 现在是抽象类,并有两个子类:SetRetainInstanceUsageViolationGetRetainInstanceUsageViolation,分别代表了两种违规类型。( Ic81e5, b/187871150)

行为变更

  • FragmentContainerView 现在在尝试通过编程或 XML 更改 fitsSystemWindow 属性时会抛出异常。内边距应由每个 Fragment 的视图独立处理。( Ie6651, b/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。这与使用 FragmentContainerView 的 ID 的 findFragmentById() 采用相同的逻辑,但允许链式调用。( Ife17a, b/162527857)

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

多个返回栈

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() 不同,如果在返回栈中找不到指定的名称或提供了空名称,它将弹出返回栈上的**所有**事务,而 saveBackStack() 如果您之前没有使用该确切的非空名称提交过 Fragment 事务,则不执行任何操作。
  • 从这些事务添加的所有 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, #150, b/143774122)

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

API 更改

新的 Lint 检查

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

Bug 修复

  • 来自 Fragment 1.3.4:修复了 Fragment 1.3.3 中使用 ViewTreeViewModelStoreOwner.get() API 与 ViewModelProvider 或 Jetpack Compose 的 viewModel() 方法在 Fragment 内部时引入的回归。这些用例现在正确使用您的 Fragment 提供的 ViewModelProvider.Factory,如果它重写了 getDefaultViewModelProviderFactory()(就像使用 Hilt 时 @AndroidEntryPoint 注解的 Fragment 所做的那样)。如果您不重写该方法,则会创建一个 SavedStateViewModelFactory 作为默认 factory,该 factory 在 Fragment 的视图旁边保存并恢复其状态。( I5cbfa, b/186097368)
  • 来自 Fragment 1.3.4:在 API 29 上使用 FragmentContainerView 时,insets 不再无限期分发,从而解决了 BottomNavigationBarFloatingActionButton 实例的问题。( I1bb78, b/186012452)
  • 来自 Fragment 1.3.4:进程终止后,您现在可以从 Fragment 结果 Bundle 中检索 Parcelable。( I65932, b/187443158)
  • 在 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-alpha03:当您尝试隐藏一个正在移除的 Fragment 时,FragmentManager 将不再崩溃。( I573dd, b/183634730)
  • 当根视图设置了 transitionGroup=”true” 时,使用 hide() 时 Fragment 的视图现在被正确设置为 GONE。( aosp/1766655, b/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 修复

  • 修复了 aosp/1679887Fragment 1.3.4 中引入的共享元素过渡的回归。Fragment 现在正确处理过渡组(通过 transitionGroup="true" 直接设置或通过 transitionNamebackground 间接设置)并且共享元素将不再抛出 IndexOutOfBoundsException。( I16484, b/188679569, b/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 1.3.3 中引入的回归,当使用 Hilt 时,在 Fragment 内部使用 ViewTreeViewModelStoreOwner.get() API 与 ViewModelProvider 或 Jetpack Compose 的 viewModel() 方法时。这些用例现在正确使用您的 Fragment 提供的 ViewModelProvider.Factory,如果它重写了 getDefaultViewModelProviderFactory()(就像 @AndroidEntryPoint 注解的 Fragment 所做的那样)。如果您不重写该方法,则会创建一个 SavedStateViewModelFactory 作为默认 factory,该 factory 在 Fragment 的视图旁边保存并恢复其状态。( I5cbfa, b/186097368)
  • 在 API 29 上使用 FragmentContainerView 时,insets 不再无限期分发,从而解决了 BottomNavigationBarFloatingActionButton 实例的问题。( I1bb78, b/186012452)
  • 进程终止后,您现在可以从 Fragment 结果 Bundle 中检索 Parcelable。( I65932, b/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 包含这些提交。

新功能

  • 现在使用 SavedStateViewModelFactory 可以与通过 Fragment 的 View 使用 ViewTreeSavedStateRegistryOwner.get() 返回的 SavedStateRegistryOwner 配合使用。( I21acf, b/181577191)

Bug 修复

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

新状态管理器错误修复

  • 新的 Fragment 状态管理器现在正确处理退出过渡和隐藏操作。( I9e4de, b/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() 操作时,最后一个操作现在将设置所有动画的方向,而不是运行一些弹出动画和一些进入动画。( I7072e, b/181142246)
  • 在共享元素层次结构中的视图在进行共享元素过渡时将不再清除其过渡名称。( I4d4a6, b/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 一起使用。( Ib9290, b/180691023)

Bug 修复

  • 使用 FragmentContainerView 膨胀到已处于 RESUMED 状态的 Activity 中的 Fragment,在配置更改后现在可以正确显示。( Ie14c8, b/180538371)
  • Fragment toString() 的末尾不再有额外的 }。( I54705, b/177761088)
  • FragmentActivity 中被覆盖的方法现在正确继承了基础方法的 JavaDoc。( I736ce, b/139548782)
  • setFragmentResultsetFragmentResultListener 的文档已更新其参数文档,以反映它们不再接受可空值。( I990ba, b/178348386)

新状态管理器错误修复

  • 修复了由 mFocusedView 导致的 Fragment 内存泄漏。( Ib4e9e, b/179925887)
  • 使用 show/hide 事务时,Fragment 现在正确调用 onCreateOptionsMenu。( I8bce8, b/180255554)
  • 在 Fragment 布局之前开始过渡的子 Fragment 现在将正确达到 RESUMED 状态。( Ic11e6, b/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 获取结果

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

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

  • FragmentScenario 改进fragment-testing artifact 中的 FragmentScenario 类已用 Kotlin 重写,并进行了多项改进:

    • FragmentScenario 现在使用 setMaxLifecycle() 来实现 moveToState(),确保在所有 API 级别上行为一致,并将 Fragment 的状态与底层 Activity 解耦。
    • FragmentScenario 现在支持设置初始 Lifecycle.State,以支持在首次进入每个 Lifecycle.State 之前断言 Fragment 的状态。
    • FragmentScenario API 的 onFragment 现在有了一个替代方案,即 Kotlin reified 扩展方法 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,该状态可以与 Activity、Fragment 和导航图关联。这允许开发者使用正常的、未保留的 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 上方。( I30806, b/177439520)
  • 修复了使用 Animation 执行 hide 操作时,隐藏的 Fragment 在动画结束时闪烁的问题。( I57e22, b/175417675)
  • 在视图层次结构附加之前添加了过渡的 Fragment 现在正确达到 RESUMED 状态。( I1fc1d, b/177154873)

新状态管理器错误修复

  • Fragment 的视图 Lifecycle 现在正确处理 Fragment 视图在 Lifecycle 达到 CREATED 之前被销毁的情况,避免了“no event down from INITIALIZED”的异常。( eda2bd, b/176138645)
  • 使用 FragmentContainerView 时,使用 Animator 的片段现在会按正确的顺序显示。(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() 相同的逻辑,并且当父片段调用 setMenuVisibility(false) 时不再被调用。(Id7de8b/173203654

新状态管理器错误修复

  • 修复了将带 Animation 的片段添加到 FragmentContainerView 中,然后通过弹出操作中断此添加时出现的泄漏和视觉伪影。(I952d8
  • 修复了片段的视图如果在其 onCreate()onViewCreated() 方法期间被替换,则会保留在视图层次结构中的问题。(I8a7d5
  • 现在,当片段的根视图恢复时,焦点会正确恢复。(Ifc84b
  • 在同一片段事务中合并弹出和替换操作现在将显示正确的动画。(Ifd4e4b/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 属性膨胀片段的 FragmentContainerViews 现在可以在 FragmentActivity 之外使用。(Id4397b/172266337
  • 现在,尝试将片段的最大生命周期设置为 DESTROYED 将抛出 IllegalArgumentException。(Ie7651b/170765622
  • 现在,使用 DESTROYED 状态初始化 FragmentScenario 将抛出 IllegalArgumentException。(I73590b/170765622

新状态管理器错误修复

  • 修复了在使用 AnimatorTRANSIT_FRAGMENT_ 选项之一中断片段转换时,视图未达到最终状态的问题。(I92426b/169874632
  • 修复了阻止带有退出 Animation 的片段被正确销毁的问题。(I83d65
  • 退出片段的效果被反转后,现在可以正确取消并以正确的进入效果重新启动。(I62226b/167092035
  • 修复了 hide() 的退出 Animator 不运行的问题。(Id7ffe
  • 片段现在在延迟后立即启动时会正确显示。(Ie713bb/170022857
  • 在动画期间移除其焦点视图的片段,一旦达到 RESUMED 状态,将不再尝试在分离的视图上恢复焦点。(I38c65b/172925703

外部贡献

  • FragmentFactory 现在为不同的 ClassLoader 实例单独缓存片段类。感谢 Simon Schiller!(#87b/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,只要片段尚未移动到 CREATED 状态。(b/159662173

API 更改

行为变更

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

Bug 修复

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

新状态管理器错误修复

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

已知问题

当使用新的状态管理器时,如果在进入特殊效果期间按下返回键而不是返回到上一个片段,旧片段永远不会被重新添加,导致空白屏幕。(b/167259187b/167092035b/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: Rebuilding the Internals》博客文章。(b/139536619b/147749580

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

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

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

行为变更

  • 您现在可以在片段的 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() 之前直接设置片段根视图的可见性会导致您设置的可见性被 FragmentManager 覆盖,后者控制根视图的可见性。作为解决方法,您应该始终使用 hide()show() 操作来更改片段的可见性。(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,而不是始终将片段移动到 RESUMED 状态。(b/159662750
  • FragmentScenario API 中添加了 onFragment 的替代方案,形式为 Kotlin 具化扩展方法 withFragment,允许您返回一个值。值得注意的是,它会重新抛出给定块中引发的异常。(b/158697631

行为变更

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

Bug 修复

  • 片段现在会等待片段的视图附加后才调用 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 修复

  • 父片段的视图状态现在在其子片段之前恢复,修复了配置更改后,当 DialogFragment 将另一个 DialogFragment 显示为子片段时出现的视觉排序问题。(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 在两个片段之间传递结果的支持。这适用于层次结构片段(父/子)、DialogFragment 和 Navigation 中的片段,并确保结果仅在片段至少处于 STARTED 状态时才发送到您的片段。(b/149787344

API 更改

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

Bug 修复

  • 片段的 getViewLifecycleOwner() 现在在调用 onSaveInstanceState() 之前停止,这与片段生命周期的行为一致。(b/154645875
  • 在片段上调用 setMenuVisibility(false) 现在可以正确更改其子片段提供的菜单的可见性。(b/153593580
  • 修复了使用 FragmentContainerView 将片段添加到 DialogFragment 的视图层次结构时出现 illegalStateException 的问题。(b/154366601
  • 当在活动之外托管您的片段时,片段上的 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 更改

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

Bug 修复

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

依赖项更改

  • 片段依赖于 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() 流程,而无需在片段中重写方法,此外还提供了测试这些流程的钩子。请参阅更新后的从 Activity 获取结果。(b/125158199

API 更改

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

Bug 修复

  • 来自 Fragment 1.2.3:修复了 DialogFragment 中的一个错误,该错误导致在 onCreateDialog() 中调用 getLayoutInflater() 时出现 StackOverflowError。(b/117894767aosp/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 更改

  • 片段上的 setRetainInstance() 方法已被弃用。随着 ViewModels 的引入,开发者有了一个特定的 API 来保留可以与 Activity、Fragment 和 Navigation 图关联的状态。这允许开发者使用正常的、未保留的片段,并保持他们想要保留的特定状态分离,从而避免了常见的泄漏源,同时保持了保留状态的单一创建和销毁的有用属性(即 ViewModel 的构造函数及其接收的 onCleared() 回调)。(b/143911815
  • 随着 ViewPager2 1.0.0 的发布,用于与 ViewPager 交互的 FragmentPagerAdapterFragmentStatePagerAdapter 类已被弃用。请参阅从 ViewPager 迁移到 ViewPager2。(b/145132715

Bug 修复

  • 片段 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
  • 修复了当状态保存后添加的保留片段在每次配置更改后不会持续重新创建然后销毁的问题。(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 修复

  • 片段的 getViewLifecycleOwner() 现在在调用 onSaveInstanceState() 之前停止,这与片段生命周期的行为一致。此功能先前已在 Fragment 1.3.0-alpha04 中发布。(b/154645875
  • 在片段上调用 setMenuVisibility(false) 现在可以正确更改其子片段提供的菜单的可见性。此功能先前已在 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 修复

  • 更新了片段 ProGuard 规则,以允许对保留的片段进行混淆。(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/117894767aosp/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
  • 对于所有包含 getrequire 等效项的片段 API,片段现在建议使用相关的 require___() 方法来获取更具描述性的错误消息,而不是 checkNotNull(get___())requireNonNull(get___())get___()!!。(aosp/1202883

Bug 修复

  • 修复了片段 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 方法添加的片段现在,它们的默认构造函数被 ProGuard 保留。(b/148181315
  • FragmentStatePagerAdapterFragmentPagerAdapter 在运行 finishUpdate() 时不再捕获 FragmentManager 抛出的异常。(aosp/1208711
  • 修复了 FragmentManager.findFragment() 不适用于通过 <fragment> 标签添加的片段的问题。(b/147784323
  • 现在,使用 <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 是动态添加片段的强烈推荐容器,取代了 FrameLayout 或其他布局的使用。它还支持与 <fragment> 标签相同的 classandroid:name 和可选的 android:tag,但使用正常的 FragmentTransaction 来添加此初始片段,而不是 <fragment> 标签使用的自定义代码路径。
  • onDestroyView() 时机:片段现在会等待退出动画、退出框架转换和退出 AndroidX 转换(当使用 Transition 1.3.0 时)完成,然后才调用 onDestroyView()
  • 基于类的 add()replace():在 FragmentTransaction 上添加了 add()replace() 的新重载,它们接受 Class<? extends Fragment> 和可选的 Bundle 参数。这些方法使用您的 FragmentFactory 来构造要添加的片段实例。使用具化类型(即 fragmentTransaction.replace<YourFragment>(R.id.container))的 Kotlin 扩展也已添加到 fragment-ktx 中。
  • Lifecycle ViewModel SavedState 集成SavedStateViewModelFactory 现在是使用 by viewModels()by activityViewModels()ViewModelProvider 构造函数或 ViewModelProviders.of() 与片段一起使用的默认工厂。
  • 新的 Lint 检查:添加了一个新的 Lint 检查,用于确保您在 onCreateView()onViewCreated()onActivityCreated() 中观察 LiveData 时使用 getViewLifecycleOwner()
  • getFragmentManager() 弃用:片段上的 getFragmentManager()requireFragmentManager() 方法已被弃用,并替换为单个 getParentFragmentManager() 方法,该方法返回片段添加到的非 null FragmentManager(您可以使用 isAdded() 来确定是否可以安全调用)。
  • FragmentManager.enableDebugLogging() 弃用:静态 FragmentManager.enableDebugLogging 方法已被弃用。FragmentManager 现在遵循标签 FragmentManagerLog.isLoggable(),允许您启用 DEBUGVERBOSE 日志记录而无需重新编译您的应用。

已知问题

  • 仅通过 FragmentContainerView 上的 classandroid:name 属性引用的片段不会被 ProGuard 自动保留,需要您手动为每个片段类添加保留规则。(b/142601969
  • 在使用 XML 中的 classandroid:nameFragmentContainerView 添加 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> 标签时出现的回归,该回归导致 onViewCreated() 在活动销毁期间被错误地调用。(b/146290333
  • 现在,使用 <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 包含这些提交

错误修复

  • 修复了一个意外的行为更改:被移除的片段在退出动画/转换运行时仍被 findFragmentById() / findFragmentByTag() 返回。(b/143982969aosp/1167585
  • 当包含活动调用 onSaveInstanceState() 时,子片段现在在其父片段之前正确停止。(b/144380645
  • 修复了弹出隐藏片段后视图被错误地标记为 INVISIBLE 的问题。(b/70793925
  • 片段共享元素转换现在可以处理已旋转、缩放等的视图。(b/142835261

文档更新

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

依赖项更改

  • 片段现在依赖于 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 现在除了 android:name 之外还支持 class 属性,镜像了 <fragment> 标签的功能。(b/142722242
  • 新增了一个 Lint 检查,用于确保您在 onCreateView()onViewCreated()onActivityCreated() 中观察 LiveData 时使用 getViewLifecycleOwner()。(b/137122478

错误修复

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

已知问题

  • 仅通过 FragmentContainerView 上的 classandroid:name 属性引用的片段不会被 ProGuard 自动保留,需要您手动为每个片段类添加保留规则。我们已禁用建议移动到 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 增加了对添加初始片段的支持,并增加了对 android:name 和可选的 android:tag XML 属性的支持。与 <fragment> 标签不同,FragmentContainerView 在底层使用正常的 FragmentTransaction 来添加初始片段,允许在 FragmentContainerView 上进行进一步的 FragmentTransaction 操作,并支持布局的视图绑定。(b/139830628b/141177981
  • 片段现在包含一个 Lint 警告,提供一个快速修复程序,将 <fragment> 替换为 FragmentContainerView。(b/139830056

错误修复

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

已知问题

  • 片段的 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 更改

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

错误修复

  • 片段现在在其他片段的退出动画运行时正确销毁。(b/140574199
  • 修复了片段调用 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 现在在弹出返回堆栈中的片段时正确反转绘制顺序。(b/139104187
  • 修复了同时弹出片段和添加新片段时会运行错误动画的问题。(b/111659726
  • 片段现在会等待转换(以及动画,它们在 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
  • 使用 FragmentTransaction 上的 setTransition 时,TRANSIT_FRAGMENT_OPENTRANSIT_FRAGMENT_CLOSETRANSIT_FRAGMENT_FADE 的默认动画已更新,以匹配 Android 10 设备上活动使用的动画。(aosp/1012812aosp/1014730

API 更改

  • 引入了 FragmentContainerView 作为动态添加片段的强烈推荐容器,取代了 FrameLayout 等的使用,因为它修复了动画 z 轴排序问题和向片段调度窗口内边距的问题。(b/37036000aosp/985243b/136494650
  • 添加了一个静态 FragmentManager.findFragment(View) 方法,用于从片段膨胀的视图中检索包含的片段。fragment-ktx 中也提供了 Kotlin 扩展。(aosp/1090757
  • FragmentTransaction 上添加了 add()replace() 的新重载,它们接受 Class<? extends Fragment> 和可选的 Bundle 参数。这些方法使用您的 FragmentFactory 来构造要添加的片段实例。使用具化类型(即 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)

错误修复

  • 修复了在弹出 FragmentTransaction 时,如果 FragmentTransactionreplace() 之前使用了 setPrimaryNavigationFragment(),就会出现 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:您现在可以将 FragmentFactory 设置到 FragmentManager,以管理 Fragment 实例的创建,从而消除了具有无参数构造函数的严格要求。
  • 适用于 ViewModel 的 Kotlin 属性委托fragment-ktx 工件现在包含两个 Kotlin 属性委托:by viewModels() 用于访问与各个 Fragment 关联的 ViewModel,以及 by activityViewModels() 用于访问 Activity 范围的 ViewModel。
  • 最大生命周期:您现在可以通过调用 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)
  • 修复了在弹出 FragmentTransaction 时,如果 FragmentTransactionreplace() 之前使用了 setPrimaryNavigationFragment(),就会出现 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)
  • OnBackPressedCallback 实例在 Fragment 的 onCreate() 中注册后,现在会正确优先于子 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 更改

  • 重大变更:之前已弃用的 FragmentFactory instantiate 方法(它接受一个 Bundle)已移除。 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),返回栈中的 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)
  • FragmentActivity 的 onActivityResult() 现在已正确标记为 @CallSuper。 (b/127971684)
  • FragmentFactory 的 instantiate 方法(它接受一个 Bundle 参数)已弃用,应用应使用新的 instantiate 重载(不接受 Bundle)。 (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)
  • 修复了在使用 @ContentView 构造函数在 Activity 上恢复 Fragment 状态时出现的问题。 (b/127313094)
  • 纠正了 setTargetFragment() 的逻辑,即当用尚未附加到 FragmentManager 的 Fragment 替换现有目标 Fragment 时。 (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)

行为变更

  • 现在,调用 remove()hide()show()detach()setPrimaryNavigationFragment()(其中 Fragment 附加到不同的 FragmentManager)会抛出 IllegalStateException 而不是静默失败 (aosp/904301)

错误修复

  • FragmentActivity 的 onNewIntent 现在已正确标记为 @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)
  • 修复了目标 Fragment 有时在 onDestroy() 中或之后不可用的问题。 (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,允许您传入父 Fragment 或其他自定义 ViewModelStoreOwner,代码示例如下:val viewModel: MyViewModel by viewModels(::requireParentFragment) [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 工件和 FragmentScenario 的首次发布,它们构建在 `androidx.test:core` API 之上。如需了解详情,请参阅Fragment 测试文档

新功能

  • 新增 FragmentScenario 类,用于独立测试 Fragment。
  • 您现在可以在任何 FragmentManager 上设置一个 FragmentFactory,以控制如何实例化新的 Fragment 实例。
  • 新增了一个 by viewModels() Kotlin 属性委托,用于从 Fragment 中检索 ViewModel。
  • 现在,待处理的输入事件(例如点击)会在 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