Fragment

将您的应用细分为在一个 activity 中托管的多个独立屏幕。
最近更新时间 稳定版 候选版 Beta 版 Alpha 版
2024 年 2 月 7 日 1.6.2 - - 1.7.0-alpha10

声明依赖项

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

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

Groovy

dependencies {
    def fragment_version = "1.6.2"

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

Kotlin

dependencies {
    val fragment_version = "1.6.2"

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

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

反馈

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

创建新问题

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

版本 1.7

版本 1.7.0-alpha10

2024 年 2 月 7 日

发布了 androidx.fragment:fragment-*:1.7.0-alpha10版本 1.7.0-alpha10 中包含这些提交内容

bug 修复

  • 修复了上一个 Fragment 版本中的已知问题:如果未通过 addOnBackStackChangedListener 添加任何 FragmentManager.OnBackStackChangedListener,那么在对 Animator 或 AndroidX Transition 使用 Fragment 的预测性返回支持后,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 的架构的应用。

这个新工件中提供的第一个功能是基于 Fragmentcontent 扩展方法,该方法旨在通过为您创建 ComposeView 并设置正确的 ViewCompositionStrategy,更轻松地将 Compose 用于单个 fragment 的界面。(561cb7b/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)

已知问题

  • Animator 或 AndroidX Transition 使用 Fragment 的预测性返回支持时,如果未通过 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 膨胀后,现在可以通过 onInflate 回调访问其状态(例如 FragmentManager、Host 和 ID)。(I1e44cb/307427423
  • Fragment 1.6.2 开始:使用 clearBackStack 移除一组 Fragment 时,当父级 Fragment 的 ViewModels 被清除时,任何嵌套 Fragment 的 ViewModel 现在都会被清除。(I6d83cb/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 转场效果时,Fragment 现在支持预测性返回。这样,您就可以使用返回手势通过自定义 Androidx Transition 跳转至上一个 fragment,然后再决定通过已完成的手势提交或取消事务。您必须依赖于 Transition 1.5.0-alpha03 版本才能启用此功能。(Ib49b4b/285175724

已知问题

  • 目前存在一个问题:在您取消具有一次转换的返回手势后,下次启动返回手势时,该手势将无法执行转换,从而导致出现空白屏幕。这可能是由 Transition Library 中的一个问题导致的。(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 无法使其进入正确的生命周期状态的问题。(I7cffeb/297379023
  • 修复了允许通过 Transition 运行动画的回归问题。(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 被跳过,并且 Activity 完成。(I0664bb/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 现在支持预测性应用内返回。这样,您就可以在决定通过已完成的手势提交事务或取消事务之前,使用返回手势查看上一个 fragment 和您的自定义 Animator。您还可以使用实验性 enablePredictiveBack() 并传入 false 来停用这种新行为。

版本 1.6

版本 1.6.2

2023 年 11 月 1 日

发布了 androidx.fragment:fragment-*:1.6.2版本 1.6.2 中包含这些提交内容

bug 修复

  • 膨胀 FragmentContainerView 的 fragment 后,现在可以通过 onInflate 回调访问其状态(例如 FragmentManager、Host 和 ID)。(I1e44cb/307427423
  • 使用 clearBackStack 移除一组 fragment 时,现在,当父级 fragment 的 ViewModels 被清除时,系统会清除任何嵌套 fragment 的 ViewModel。(I6d83cb/296173018

版本 1.6.1

2023 年 7 月 26 日

发布了 androidx.fragment:fragment-*:1.6.1版本 1.6.1 中包含这些提交内容

bug 修复

  • 修复了以下问题:即使 fragment 实例已恢复为 RESUMED 状态,在 activity 停止但未销毁时存储的已保存状态也会错误地缓存。在使用多返回堆栈 API 保存和恢复该 fragment 时,如果该 fragment 实例位于返回堆栈中,这会导致重复使用缓存状态。(I71288b/246289075

依赖项更新

  • 现在,Fragment 依赖于 Activity 1.7.2。这修复了以下问题:如果没有显式依赖 Activity,Kotlin 用户就无法扩展 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 正确进行注解,以防止传入 null 值,因为 null 值始终会立即使这些方法调用的相应 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 测试组件的其余部分分开。这意味着您可以执行以下操作:

    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 时包含错误的请求代码的问题。(If0b9db/249519359
  • 修复了以下问题:如果事务中混入了更改返回堆栈的事务,则会为实际并未更改返回堆栈的事务分派 onBackStackChangeListener 回调。(I0eb5cb/279306628

版本 1.6.0-beta01

2023 年 4 月 19 日

发布了 androidx.fragment:fragment-*:1.6.0-beta01版本 1.6.0-beta01 中包含这些提交内容

bug 修复

  • postponeEnterTransition 与超时搭配使用,然后替换推迟的 fragment,不会再导致泄露推迟的 fragment。(I2ec7db/276375110
  • 现在,即使多个事务包含同一个 fragment,新的 onBackStackChangeStartedonBackStackChangeCommitted 回调将仅分派一次 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 的访问权限。(I022e3b/234274777
  • fragment commitNow()executePendingTransactions()popBackStackImmediate() API 带有 @MainThread 注解,这意味着它们现在会在未从主线程调用时(而不是在运行时等待失败)时抛出构建错误。(Ic9665b/236538905

bug 修复

  • 修复了 FragmentManager 中的以下 bug:在同一帧中保存和恢复可能会导致崩溃。(Ib36afb/246519668
  • OnBackStackChangedListener onBackStackChangeStartedonBackStackChangeCommitted 回调现在仅在 FragmentManager 返回堆栈发生更改时执行。(I66055b/274788957

版本 1.6.0-alpha08

2023 年 3 月 22 日

发布了 androidx.fragment:fragment-*:1.6.0-alpha08版本 1.6.0-alpha08 中包含这些提交内容

行为变更

  • OnBackStackChangedListener.onBackStackChangeCommited 回调的时间已调整为在执行 fragment 操作之前执行。这样可以确保绝不会向该回调函数传递已分离的 fragment。(I66a76b/273568280

bug 修复

  • Fragment 1.5.6 开始:修复了当 Lifecycle 已处于 STARTED 状态且结果已可用时,在 setFragmentResultListener 内调用 clearFragmentResultListener 不起作用的问题。(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 菜单失效的问题。(50f098b/244336571

版本 1.6.0-alpha06

2023 年 2 月 22 日

发布了 androidx.fragment:fragment-*:1.6.0-alpha06版本 1.6.0-alpha06 中包含这些提交内容

行为变更

  • 现在,系统会在 fragment 开始转为其目标状态之前对 FragmentManageronBackStackChangedListener 执行新的 onBackStackChangedStarted 回调。(I34726)

版本 1.6.0-alpha05

2023 年 2 月 8 日

发布了 androidx.fragment:fragment-*:1.6.0-alpha05版本 1.6.0-alpha05 中包含这些提交内容

新功能

  • FragmentManager.OnBackStackChagnedListener 接口现在提供两个额外的回调:onBackStackChangeStartedonBackStackChangeCommitted,它们可让您获得更多信息并控制 FragmentManager 中返回堆栈发生更改的时间。(Ib7ce5b/238686802

API 变更

  • 采用 IntentIntentSenderFragmentFragmentManager API 现在已使用 @NonNull 正确进行注解,以避免传入 null 值,因为 null 值总会立即导致这些方法调用的各 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 中的情况。(I72521b/249299268

行为变更

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

API 变更

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

这样可以避免因 fragment-testingandroidx.test 之间的版本偏差导致冲突。(I8e534b/128612536

bug 修复

  • Fragment 1.5.5 开始:fragment 不会再将 ViewModel 状态错误地保存为视图注册数据库保存状态的一部分。(I10d2bb/253546214

版本 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。(I14798b/238928865

bug 修复

  • 修复了因集成新提供程序回调接口(OnConfigurationChangedProviderOnMultiWindowModeChangedProviderOnTrimMemoryProviderOnPictureInPictureModeChangedProvider)而导致的回归问题,以确保 fragment 始终获得正确的回调。(I9b380I34581、[I8dfe6b/242570955]、If9d6bId0096I690b3I2cba2

版本 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 的问题。(2Ib1c07b/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。(I2ec7db/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 菜单失效的问题。(50f098b/244336571
  • 修复了当 Lifecycle 已处于 STARTED 状态且结果已可用时,在 setFragmentResultListener 内调用 clearFragmentResultListener 不起作用的问题。(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 状态错误地保存为视图注册数据库保存状态的一部分。(I10d2bb/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 修复

  • 修复了以下错误:将自定义 FragmentController 与未实现提供程序回调接口(OnConfigurationChangedProviderOnMultiWindowModeChangedProviderOnTrimMemoryProviderOnPictureInPictureModeChangedProvider)的主机一起使用,并且调用其已废弃的调度函数时,无法调度到子 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() 回调的错误。(I34581I8dfe6b/242570955
  • 嵌套的子 fragment 将不会再收到多个 onMultiWindowModeChanged()onPictureInPictureModeChanged()onLowMemory()onConfigurationChanged() 回调。(I690b3Id0096If9d6bI2cba2

版本 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 的问题。(Ib1c07b/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 现在可通过将 allowViolation() 与类名称结合使用,使不公开的第三方 fragment 绕过特定的违规处罚。
  • 用于为 activity 的 ActionBar 提供菜单的 fragment API 已废弃。Activity 1.4.0 中添加的 MenuHostMenuProvider API 提供了一个可测试的生命周期感知型等效 API Surface,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 相关联。(a153e0b/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 的状态。(I15c36b/72644830

已保存实例状态重构

  • FragmentManager 现在会将已保存实例状态保存到 Bundle 中,而不是直接保存到自定义 Parcelable 中。这是让用户更清楚地了解 Fragment 实际保存的内容的第一步。(I93807b/207158202
  • 通过 Fragment Result API 设置且尚未传送的结果现在会与 FragmentManager 的内部状态分开保存。这样,您就可以更清楚地了解已保存实例状态中将保存哪些结果。(I6ea12b/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 已废弃,因为这些 API 会将 fragment 与 activity 紧密耦合,而且无法单独测试。Activity 1.4.0-alpha01 中添加的 MenuHostMenuProvider API 提供了一个可测试的生命周期感知型等效 API Surface,Fragment 应使用这些 API。(I50a59I20758

bug 修复

  • SavedStateViewFactory 现在支持使用 CreationExtras,即使其通过 SavedStateRegistryOwner 进行初始化也不受影响。如果提供 extra,则会忽略初始化的参数。(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 现在可通过将 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 中包含这些提交内容

新功能

bug 修复

  • Fragment 1.4.1 开始:当通过 xml 生成的 view ID 具有负值时,FragmentContainerView 不会再抛出非法状态异常。(Ic185bb/213086140
  • Fragment 1.4.1 开始:将自定义 ownerProducer lambda 与 by viewModels() 延迟函数结合使用时,如果未提供自定义 ViewModelProvider.Factory,该 lambda 现在会使用来自该所有者的 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 修复

  • 当通过 xml 生成的 view ID 具有负值时,FragmentContainerView 不会再抛出非法状态异常。(Ic185bb/213086140
  • 将自定义 ownerProducer lambda 与 by viewModels() 延迟函数结合使用时,如果未提供自定义 ViewModelProvider.Factory,该 lambda 现在会使用来自该所有者的 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。检测到违规情况时,您可以选择输出日志消息,触发您的自定义监听器,或让应用崩溃。通过新方法 setStrictModePolicy(),可以在 FragmentManager 上设置 FragmentStrictMode.Policy,以控制启用哪些检查以及触发哪些“处罚”。该政策适用于 FragmentManager 并传递给未设置自己的专属政策的任何子 fragment 管理器。请参阅 fragment 的 StrictMode
  • FragmentContainerView 现在提供了一个 getFragment() 方法,该方法会返回最近添加到容器的 fragment。它采用的逻辑与 findFragmentById() 方法通过 FragmentContainerView 的 ID 返回 fragment 相同,但允许将调用链在一起。

    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() 始终包含边界值。
  • 如果在返回堆栈中找不到指定名称或是提供了 null 名称,popBackStack() 会对返回堆栈中的所有事务执行出栈操作;与之不同的是,如果您之前没有使用 addToBackStack() 和确切的非 null 名称提交过 fragment 事务,那么 saveBackStack() 不会执行任何操作。
  • 系统会保存通过这些事务添加的所有 fragment 的状态。这意味着系统会存储每个 fragment 的 View 状态、调用每个 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 视图的 fragment 后,键盘现在将自动关闭。(I8b842b/196852211)
  • DialogFragment 现在对您在调用 show()showNow()dismiss() 时创建的所有事务使用 setReorderingAllowed(true)。(Ie2c14)
  • DetachAndAttachFragmentInSameFragmentTransaction 这个超长 lint 警告已缩短为 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 Lifecycle 的用法更正为 Fragment 视图 Lifecycle。(aosp/1830457b/200326272

文档更新

  • 现在,由 Activity Result API(即 startActivityForResultstartIntentSenderForResultonActivityResultrequestPermissionsonRequestPermissionsResult)处理的 API 的废弃消息均已扩展,并提供了更多详情。(cce80f)
  • 我们为 FragmentDialogFragment 扩展了 onActivityCreated() 的废弃消息,并提供了更多详情。(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 变更

  • 用 Kotlin 重写了 FragmentContainerView 类,以确保 getFragment 函数正确遵循是否可为 null 性规则。(If694ab/189629145
  • FragmentStrictMode 现已采用 Kotlin 编写(I11767b/199183506

bug 修复

  • 修复了以下问题:如果某个 fragment 是在执行待处理事务之前通过 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)
  • 在专门通过 show(FragmentTransaction, String) 方法添加 DialogFragment 且保存状态后,如果您调用 DialogFragmentdismissAllowingStateLoss() 方法,该方法不会再崩溃。(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.6 开始:FragmentActivity 现在会始终解锁“已保存”状态,作为它替换的生命周期回调中的第一个操作。(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 状态(即使是在这些 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 的限制,这样就不会让应用再出现崩溃。(6b8dddb/190622202

bug 修复

  • Fragment 1.3.5 开始:通过 aosp/1679887 修复了在 Fragment 1.3.4 中引入的共享元素转换回归问题。无论是通过 transitionGroup="true" 直接设置的还是通过 transitionNamebackground 间接设置的转换组,fragment 现在都可以正确处理,并且共享元素不会再抛出 IndexOutOfBoundsException。(I16484b/188679569b/188969304
  • 尝试隐藏正在移除的 fragment 时,FragmentManager 将不会再崩溃。(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 中包含这些提交内容

新功能

  • 现在,无论当前使用哪种严格模式政策,如果通过 FragmentManager 启用日志记录,FragmentStrictMode 将始终记录违规情形。(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

行为变更

  • 现在,尝试以编程方式或通过 XML 更改 fitsSystemWindow 属性时,FragmentContainerView 会抛出异常。边衬区应该由各个 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 返回 fragment 相同,但允许将调用链在一起。(Ife17ab/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() 始终包含边界值。
  • 如果在返回堆栈中找不到指定名称或是提供了 null 名称,popBackStack() 会对返回堆栈中的所有事务执行出栈操作;与之不同的是,如果您之前没有使用 addToBackStack() 和确切的非 null 名称提交过 fragment 事务,那么 saveBackStack() 不会执行任何操作。
  • 系统会保存通过这些事务添加的所有 fragment 的状态。这意味着系统会存储每个 fragment 的 View 状态、调用每个 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。检测到违规情况时,您可以选择输出日志消息,触发您的自定义监听器,或让应用崩溃。通过新方法 setStrictModePolicy(),可以在 FragmentManager 上设置 FragmentStrictMode.Policy,以控制启用哪些检查以及触发哪些“处罚”。该政策适用于 FragmentManager 并传递给未设置自己的专属政策的任何子 fragment 管理器。(#123#131#150b/143774122

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

API 变更

新增的 Lint 检查

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

bug 修复

  • Fragment 1.3.4 起:修复了 Fragment 1.3.3 中引入的如下回归问题:在 fragment 中将 ViewTreeViewModelStoreOwner.get() API 与 ViewModelProvider 或 Jetpack Compose 方法 viewModel() 搭配使用时出现的问题。如果与 fragment 提供的 ViewModelProvider.Factory 会替换 getDefaultViewModelProviderFactory(),则这些用例现在会正确使用前者(正如使用 Hilt 时通过 @AndroidEntryPoint 注解的 fragment 的作用)。如果您不替换该方法,则系统会创建 SavedStateViewModelFactory,作为保存和恢复其状态以及 fragment 视图的默认工厂。(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-alpha03 开始:当您尝试隐藏正在移除的 fragment 时,FragmentManager 不再崩溃。(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 修复

  • 通过 aosp/1679887 修复了在 Fragment 1.3.4 中引入的共享元素转换回归问题。无论是通过 transitionGroup="true" 直接设置的还是通过 transitionNamebackground 间接设置的转换组,fragment 现在都可以正确处理,并且共享元素不会再抛出 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 1.3.3 引入的如下回归问题:在 fragment 中将 ViewTreeViewModelStoreOwner.get() API 与 ViewModelProvider 或 Jetpack Compose 方法 viewModel()(使用 Hilt 时)搭配使用时出现的问题。如果与 fragment 提供的 ViewModelProvider.Factory 会替换 getDefaultViewModelProviderFactory(),则这些用例现在会正确使用前者(正如通过 @AndroidEntryPoint 注解的 Fragment 的作用)。如果您不替换该方法,则系统会创建 SavedStateViewModelFactory,作为保存和恢复其状态以及 fragment 视图的默认工厂。(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 中包含这些提交内容

新功能

  • SavedStateViewModelFactory 现在可以与通过将 ViewTreeSavedStateRegistryOwner.get() 与 Fragment 的视图结合使用后返回的 SavedStateRegistryOwner 一起使用。(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

新状态管理器 bug 修复

  • 新的 fragment 状态管理器现在可以使用 hide 操作正确处理退出过渡。(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 中包含这些提交内容

新状态管理器 bug 修复

  • 现在,同时运行 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 中的 Dialog 现在可以通过其 DecorateView 访问 ViewTree 所有者,从而确保 ComposeView 可与 DialogFragment 一起使用。(Ib9290b/180691023

bug 修复

  • 现在,当配置更改后,使用 FragmentContainerView 膨胀到状态已变为 RESUMED 的 activity 的 fragment 可以正确显示。(Ie14c8b/180538371
  • fragment toString() 的结尾不再包含多余的 }(I54705b/177761088
  • FragmentActivity 中被替换的方法现在可以正确继承基础方法 javaDoc(I736ceb/139548782
  • setFragmentResultsetFragmentResultListener 的相关文档更新了其参数说明,以反映它们不再接受可为 null 值 (I990bab/178348386

新状态管理器 bug 修复

  • 修复了 fragment 中由 mFocusedView 引起的内存泄漏问题(Ib4e9eb/179925887
  • 现在,fragment 在使用 show/hide 事务时可以正确调用 onCreateOptionsMenuI8bce8b/180255554
  • 如果子 fragment 包含有在正在布局的 fragment 开始之前开始的事务,这些子 fragment 现在可以正确地达到状态 RESUMEDIc11e6b/180825150
  • 现在,使用 <fragment> 标记膨胀的 fragment 将始终变为 RESUMED 状态(I452acI9fa49

依赖项更新

版本 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 的支持,让您无需替换 fragment 中的方法,即可处理 startActivityForResult()+onActivityResult() 以及 requestPermissions()+onRequestPermissionsResult() 流程,此外还提供了用于测试这些流程的钩子。请参阅更新后的获取 Activity 的结果一文。

    • 此版本修复了以下方面的一些问题:无效请求代码,以及会阻止 Activity Result API 处理先前 FragmentActivity 版本的权限请求的调度。您必须升级到 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 获取结果

  • FragmentOnAttachListener:弃用了对 FragmentActivityFragmentonAttachFragment() 回调。新添加了 FragmentOnAttachListener,以提供更灵活的替代选项,从而允许将 onAttachFragment() 委托给单独的可测试监听器,并支持向除您的直接子级 FragmentManager 以外的 FragmentManager 添加监听器。

  • FragmentScenario 改进fragment-testing 工件中的 FragmentScenario 类已使用 Kotlin 重写,并进行了一些改进:

    • FragmentScenario 现在使用 setMaxLifecycle() 来实现 moveToState(),从而确保在所有 API 级别中实现一致的行为,并将 Fragment 的状态与底层 Activity 分离。
    • 现在,FragmentScenario 支持设置初始 Lifecycle.State,以支持在首次移至每个 Lifecycle.State 之前断言 Fragment 的状态。
    • 现在,您可以使用具体化的 Kotlin 扩展方法 withFragment(允许您返回值)的形式来替代 onFragmentFragmentScenario API。值得注意的是,这会重新抛出指定代码块中发生的异常。
  • ViewTree 支持Fragment 现在支持在 Lifecycle 2.3.0SavedState 1.1.0 中添加的 ViewTreeLifecycleOwner.get(View)ViewTreeViewModelStoreOwner.get(View)ViewTreeSavedStateRegistryOwner API,以便在使用 Fragment 中的 View 时将相应 fragment 返回为 ViewModelStoreOwner,以及与相应 fragment 的视图 Lifecycle 关联的 SavedStateRegistryOwnerLifecycleOwner

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

  • setRetainInstance() 弃用:已弃用 Fragment 上的 setRetainInstance() 方法。引入 ViewModel 后,开发者可以使用特定 API 保留与 Activity、Fragment 以及 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

新状态管理器 bug 修复

  • Fragment 的视图 Lifecycle 现在可以正确处理 Fragment 视图在 Lifecycle 达到 CREATED 状态之前被销毁的情况,从而避免返回“no event down from INITIALIZED”的异常。(eda2bdb/176138645
  • 使用 FragmentContainerView 时,使用 Animator 的 Fragment 现在以正确顺序显示。(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) 时,系统不再对其进行调用。(Id7de8b/173203654

新状态管理器 bug 修复

  • 修复了在向 FragmentContainerView 添加具有 Animation 的 Fragment,然后利用弹出操作中断相应添加时出现泄漏和视觉痕迹的问题。(I952d8)
  • 修复了如下问题:fragment 的视图在其 onCreate()onViewCreated() 方法中被替换后仍保留在视图层次结构中。(I8a7d5)
  • 现在,当 Fragment 根视图恢复时,相应根视图会正确恢复获得焦点的状态。(Ifc84b)
  • 现在,在同一 Fragment 事务中结合使用弹出和替换操作时,系统会显示适当的动画(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 属性膨胀 Fragment 的 FragmentContainerViews 现在可以在 FragmentActivity 之外使用。(Id4397b/172266337
  • 现在,如果尝试将 Fragment 的最大生命周期设为 DESTROYED,则会抛出 IllegalArgumentExceptionIe7651b/170765622
  • 现在,如果初始化处于 DESTROYED 状态的 FragmentScenario,则会抛出 IllegalArgumentExceptionI73590b/170765622

新状态管理器 bug 修复

  • 修复了如下问题:当某个 fragment 转换中用到 Animator 或其中一个 TRANSIT_FRAGMENT_ 选项时,如果您中断该转换,视图就会无法达到其最终状态。(I92426b/169874632
  • 修复了导致具有退出 Animation 的 fragment 无法正确销毁的问题。(I83d65)
  • 现在,已将其效果反转的退出 Fragment 可以正确取消,并且能够以适当的进入效果重启。(I62226b/167092035
  • 修复了 hide() 的退出 Animator 无法运行的问题。(Id7ffe)
  • 现在,Fragment 在推迟并立即启动后会正确显示。(Ie713bb/170022857
  • 如果 Fragment 在某动画呈现期间移除了自己的聚焦视图,那么这些 Fragment 在达到 RESUMED 状态后将不再尝试在已分离的视图上恢复焦点(I38c65b/172925703

外部贡献

  • 现在,FragmentFactory 为不同的 ClassLoader 实例单独缓存 Fragment 类。感谢 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,前提是 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)

新状态管理器 bug 修复

  • Fragment 现在可以在启动动画之前正确恢复其视图焦点状态。(Icc256)
  • 现在,仅具有共享元素过渡的 Fragment 会正确完成其特殊效果,这意味着它们实际上会转为其最终状态(Iaebc7b/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/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 操作的上一个 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)
  • 在从 onAttachFragment() 回调内调用 findFragmentById()findFragmentByTag() 时,FragmentManager 现在会返回正确的 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)
  • 以具体化的 Kotlin 扩展方法 withFragment(允许您返回值)的形式,为 onFragmentFragmentScenario API 添加了替代选项。值得注意的是,这会重新抛出指定代码块中发生的异常。(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 中包含这些提交内容。

新功能

  • 弃用了对 FragmentActivityFragmentonAttachFragment() 回调。新添加了 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 结果 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)
  • 修复了在向具有 FragmentContainerViewDialogFragment 视图层次结构添加 Fragment 时出现的 illegalStateException。(b/154366601)
  • 在 Activity 之外托管 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/151652127aosp/1263328aosp/1265163
  • 修复了更改配置后在 Fragment 中使用 prepareCall 时发生的崩溃问题。(b/152137004)
  • 修复了使用 setTargetFragment() 时共享元素和退出过渡被忽略的问题。(b/152023196)
  • Fragment 1.2.4 开始:更新了 Fragment ProGuard 规则,允许混淆处理保留的 Fragment。(b/151605338)
  • Fragment 1.2.4 开始:对 DialogFragment 类停用了 FragmentLiveDataObserve Lint 规则,因为它们的 Lifecycle 和视图 Lifecycle 始终保持同步,因此可以在调用 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 的支持,让您无需覆盖 Fragment 中的方法,即可处理 startActivityForResult()+onActivityResult() 以及 requestPermissions()+onRequestPermissionsResult() 流程,并提供用于测试这些流程的钩子。请参阅更新后的获取 Activity 的结果一文。(b/125158199)

API 变更

  • DialogFragment 现在提供了一个采用 @LayoutRes 的构造函数,后者用于指明默认情况下 onCreateView() 应该膨胀的布局。(b/150327080)
  • onActivityCreated() 方法现已弃用。与 Fragment 视图有关的代码应在 onViewCreated()(在 onActivityCreated() 之前调用)中执行,而其他初始化代码应在 onCreate() 中执行。如需专门在 activity 的 onCreate() 完成时接收回调,应在 onAttach() 中的 activity 的 Lifecycle 上注册 LifeCycleObserver,并在收到 onCreate() 回调后将其移除。(b/144309266)

bug 修复

  • Fragment 1.2.3 开始:修复了 DialogFragment 中的 bug,即从 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.3 开始:FragmentContainerView 不再因为在布局预览中使用不正确的构造函数而抛出 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)
  • 在 Android Studio 中使用布局预览时,FragmentContainerView 不再抛出 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 规则,因为它们的 Lifecycle 和视图 Lifecycle 始终保持同步,因此可以在调用 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 中的 bug,即从 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 建议将 viewLifecycleOwner 用作 LifecycleOwner,以调用 onCreateView()onViewCreated()onActivityCreated() 中的 OnBackPressedDispatcher。(b/142117657)
  • 添加了新的 Lint 检查,用于确认您在使用 fragment-testing 工件时是否使用了正确的 debugImplementation。(b/141500106)
  • 现在,Fragment 建议使用关联的 require___() 方法处理更多描述性错误消息,而不是对同时包含 getrequire 等效方法的所有 Fragment API 使用 checkNotNull(get___())requireNonNull(get___())get___()!!。(aosp/1202883)

bug 修复

  • 修复了 Fragment ProGuard 文件,以避免 R8 警告 (b/148963981)
  • 改进了现有的 Lint 检查,建议在使用 observe 同时处理 observe 的扩展方法版本 livedata-ktx 时使用 viewLifecycleOwner。(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 中包含这些提交内容

bug 修复

  • 现在,ProGuard 会保留通过可获取 Class 实例(或 Kotlin 具体化版本)的 addreplace 方法添加的 Fragment 的默认构造函数。(b/148181315)
  • 在运行 finishUpdate() 时,FragmentStatePagerAdapterFragmentPagerAdapter 不再捕获 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 以来的重要变更

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

已知问题

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

版本 1.2.0-rc05

2020 年 1 月 8 日

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

bug 修复

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

版本 1.2.0-rc04

2019 年 12 月 18 日

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

bug 修复

  • 调整了 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 中包含以下提交内容

bug 修复

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

文档更新

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

依赖项变更

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

版本 1.2.0-rc02

2019 年 11 月 7 日

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

bug 修复

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

版本 1.2.0-rc01

2019 年 10 月 23 日

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

新功能

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

bug 修复

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

已知问题

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

版本 1.2.0-beta02

2019 年 10 月 11 日

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

bug 修复

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

版本 1.2.0-beta01

2019 年 10 月 9 日

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

新功能

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

bug 修复

  • 修复了使用 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)

bug 修复

  • 现在,当其他 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 变更

bug 修复

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

版本 1.2.0-alpha02

2019 年 8 月 7 日

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

新功能

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

API 变更

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

bug 修复

  • 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)

bug 修复

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

版本 1.1.0

版本 1.1.0

2019 年 9 月 5 日

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

自 1.0.0 以来的重要变更

  • fragment-testingfragment-testing 工件提供了一个 FragmentScenario 类,用于单独测试 Fragment。如需了解详情,请参阅“测试应用的 Fragment”文档
  • FragmentFactory:您现在可以在 FragmentManager 上设置一个 FragmentFactory,以管理 Fragment 实例的创建,从而消除必须具有无参数构造函数这一严格要求。
  • 适用于 ViewModel 的 Kotlin 属性委托fragment-ktx 工件现在包含两个 Kotlin 属性委托: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。点击此处可查看此版本中包含的提交内容。

bug 修复

  • 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。点击此处可查看此版本中包含的提交内容。

bug 修复

  • 修复了多次调用设有超时的 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。点击此处可查看此版本中包含的提交内容。

bug 修复

  • 修复了移除当前项时 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。点击此处可查看此版本中包含的提交内容。

bug 修复

  • 在转换运行时,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。点击此处可查看此版本中包含的提交内容。

bug 修复

  • 适用于嵌套 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

bug 修复

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

版本 1.1.0-alpha08

2019 年 5 月 7 日

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

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

新功能

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

API 变更

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

bug 修复

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

版本 1.1.0-alpha07

2019 年 4 月 25 日

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

新功能

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

API 变更

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

行为变更

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

bug 修复

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

版本 1.1.0-alpha06

2019 年 4 月 3 日

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

新功能

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

API 变更

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

bug 修复

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

版本 1.1.0-alpha05

2019 年 3 月 13 日

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

新功能

行为变更

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

bug 修复

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

版本 1.1.0-alpha04

2019 年 2 月 7 日

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

新功能

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

API 变更

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

bug 修复

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

版本 1.1.0-alpha03

2018 年 12 月 17 日

新功能

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

API 变更

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

bug 修复

  • 修复了“保存状态失败”这一 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)

bug 修复

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

版本 1.1.0-alpha01

2018 年 11 月 5 日

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

新功能

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

API 变更

  • 大幅扩展了 Fragment API 接口的可为 null 性注解。

bug 修复

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

已知问题

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