Fragment
最新更新 | 稳定版发布 | 候选版本 | 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 修复
FragmentContainerView
的setOnApplyWindowInsetsListener
覆盖现在接受空监听器,与框架允许的匹配。( 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)- 通过接受
ViewGroup
的FragmentTransaction.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 的方法。FragmentManager
的OnBackStackChangedListener
接口上的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 状态的保存和恢复。这可以直接替代 AndroidViewBindingComposable
。( b/312895363, Icf841)
文档更改
- 更新了
OnBackStackChangedListener
API 的文档,以指示何时调用以及如何使用它们。( I0bfd9)
依赖项更新
- Fragment 现在依赖于 Profile Installer 1.3.1。
版本 1.7
版本 1.7.1
2024 年 5 月 14 日
androidx.fragment:fragment-*:1.7.1
已发布。版本 1.7.1 包含这些提交。
Bug 修复
- 预测性返回现在仅针对所有 Fragment 都具有 Animator 或可寻道 Androidx Transition 的事务运行。这修复了取消部分可寻道事务会导致空白屏幕的问题。( I43037, b/339169168)
版本 1.7.0
2024 年 5 月 1 日
androidx.fragment:fragment-*:1.7.0
已发布。版本 1.7.0 包含这些提交。
预测性返回手势支持
- 使用
Animator
或 AndroidX Transition 1.5.0 时,Fragment 现在支持预测性应用内返回。这允许用户在决定通过完成手势提交事务或取消之前,通过寻道 Animator/Transition 来查看上一个 Fragment。
过渡系统 | XML 资源 | 支持预测性返回 |
---|---|---|
动画 |
R.anim |
否 |
动画器 |
R.animator |
是 |
框架 Transition |
R.transition |
否 |
AndroidX Transition 与 Transition 1.4.1 或更低版本 |
R.transition |
否 |
AndroidX Transition 与 Transition 1.5.0 |
R.transition |
是 |
如果您在选择预测性返回手势后在 Fragment 中发现预测性返回支持的任何问题,请向 Fragment 提交问题,并提供一个可重现您问题的示例项目。您可以通过在 Activity 的 onCreate()
中使用 FragmentManager.enabledPredictiveBack(false)
来禁用预测性返回。
FragmentManager.OnBackStackChangedListener()
现在提供 onBackStackChangeProgressed()
和 onBackStackChangeCancelled()
,分别用于接收预测性返回进度和取消事件。
Fragment Compose 工件
已创建新的 fragment-compose
工件,旨在支持正在从基于 Fragment 的架构转向完全基于 Compose 的架构的应用。
此新工件中的第一个可用功能是 Fragment
上的 content
扩展方法,旨在通过为您创建 ComposeView
并设置正确的 ViewCompositionStrategy
,使在单个 Fragment 的 UI 中使用 Compose 变得更加容易。
class ExampleFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
) = content {
// Write your @Composable content here
val viewModel: ExampleViewModel = viewModel()
// or extract it into a separate, testable method
ExampleComposable(viewModel)
}
}
版本 1.7.0-rc02
2024 年 4 月 17 日
androidx.fragment:fragment-*:1.7.0-rc02
已发布。版本 1.7.0-rc02 包含这些提交。
Bug 修复
- 添加了日志以指示为何在没有任何其他过渡的情况下设置
sharedElement
会导致无法运行。( Iec48e) - 修复了一个错误,即如果将不可寻道的共享元素添加到所有其他过渡都可寻道的事务中,则会发生崩溃。现在,该事务将正确地被视为不可寻道。( I18ccd)
版本 1.7.0-rc01
2024 年 4 月 3 日
androidx.fragment:fragment-*:1.7.0-rc01
已发布。版本 1.7.0-rc01 包含这些提交。
依赖项更新
- Fragment 现在依赖于 Profile Installer 1.3.1。
版本 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 包含这些提交。
清理
- 删除了在 Transition
1.5.0-alpha06
中修复的 Transition 库的临时解决方案。( I04356)
版本 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 包含这些提交。
依赖项更新
- Fragments 已更新,以依赖于在 Transition
1.5.0-alpha04
中添加的新animateToStart
API。
版本 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 和预测性返回手势时,如果您使用的过渡系统不支持寻道(
Animations
、Transitions
)或根本没有过渡,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
接口已扩展,增加了两个额外的回调onBackStackChangeStarted
和onBackStackChangeCommitted
,它们分别在每个Fragment
添加/从 Fragment 返回栈中移除之前和事务提交之后调用。FragmentStrictMode
添加了一个新的WrongNestedHierarchyViolation
,用于检测子 Fragment 嵌套在其父 Fragment 的 View 层次结构中但未添加到父 Fragment 的childFragmentManager
中的情况。- 接受
Intent
或IntentSender
的Fragment
和FragmentManager
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-testing
和androidx.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) - 新的
onBackStackChangeStarted
和onBackStackChangeCommitted
回调现在只会针对单个 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) OnBackStackChangedListener
的onBackStackChangeStarted
和onBackStackChangeCommitted
回调现在仅在FragmentManager
返回栈更改时执行。( I66055, b/274788957)
版本 1.6.0-alpha08
2023 年 3 月 22 日
androidx.fragment:fragment-*:1.6.0-alpha08
已发布。版本 1.6.0-alpha08 包含这些提交。
行为变更
OnBackStackChangedListener.onBackStackChangeCommited
回调的执行时间已调整为在 Fragment 操作执行之前执行。这确保回调永远不会传递已分离的 Fragment。( I66a76, b/273568280)
Bug 修复
- 来自Fragment
1.5.6
:修复了在setFragmentResultListener
中调用clearFragmentResultListener
在Lifecycle
已经STARTED
并且结果已经可用时不起作用的问题。( If7458)
依赖项更新
- Fragment 现在依赖于 Lifecycle
2.6.1
。( 586fe7) - Fragment 现在依赖于 SavedState
1.2.1
。( 078e4e) - Fragment 现在依赖于 ProfileInstaller
1.3.0
。( 3fc05b)
版本 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 包含这些提交。
行为变更
FragmentManager
的onBackStackChangedListener
上的新onBackStackChangedStarted
回调现在将在 Fragment 开始移动到其目标状态之前执行。( I34726)
版本 1.6.0-alpha05
2023 年 2 月 8 日
androidx.fragment:fragment-*:1.6.0-alpha05
已发布。版本 1.6.0-alpha05 包含这些提交。
新功能
FragmentManager.OnBackStackChagnedListener
接口现在提供两个额外的回调:onBackStackChangeStarted
和onBackStackChangeCommitted
,允许在FragmentManager
中发生返回栈更改时提供额外信息和控制。( Ib7ce5, b/238686802)
API 更改
- 接受
Intent
或IntentSender
的Fragment
和FragmentManager
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-testing
和 androidx.test
之间的版本偏差引起的冲突。( I8e534, b/128612536)
Bug 修复
- 来自Fragment
1.5.5
:Fragment 将不再错误地将ViewModel
状态保存为视图注册表保存状态的一部分。( I10d2b, b/253546214)
版本 1.6.0-alpha03
2022 年 10 月 5 日
androidx.fragment:fragment:1.6.0-alpha03
、androidx.fragment:fragment-ktx:1.6.0-alpha03
和 androidx.fragment:fragment-testing:1.6.0-alpha03
已发布。版本 1.6.0-alpha03 包含这些提交。
API 更改
- 扩展
DialogFragment
的类现在将需要在其onDismiss()
覆盖中调用 super。( I14798, b/238928865)
Bug 修复
- 修复了由于集成新的提供程序回调接口(
OnConfigurationChangedProvider
、OnMultiWindowModeChangedProvider
、OnTrimMemoryProvider
、OnPictureInPictureModeChangedProvider
)引起的回归,以确保 Fragment 始终获得正确的 callbacks。( I9b380,I34581, (I8dfe6, b/242570955),If9d6b,Id0096,I690b3,I2cba2)
版本 1.6.0-alpha02
2022 年 8 月 24 日
androidx.fragment:fragment:1.6.0-alpha02
、androidx.fragment:fragment-ktx:1.6.0-alpha02
和 androidx.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-alpha01
、androidx.fragment:fragment-ktx:1.6.0-alpha01
和 androidx.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)
依赖项更新
- 来自Fragment
1.5.1
:Fragment 库现在依赖于 Lifecycle2.5.1
。( Id204c) - 来自Fragment
1.5.1
:Fragment 库现在依赖于 Activity1.5.1
。( I10f07)
版本 1.5
版本 1.5.7
2023 年 4 月 19 日
androidx.fragment:fragment:1.5.7
、androidx.fragment:fragment-ktx:1.5.7
和 androidx.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.6
、androidx.fragment:fragment-ktx:1.5.6
和 androidx.fragment:fragment-testing:1.5.6
已发布。版本 1.5.6 包含这些提交。
Bug 修复
- 修复了移除任何 Fragment(无论它是否添加了菜单项)都会使 activity 菜单无效的问题。( 50f098, b/244336571)
- 修复了在
setFragmentResultListener
中调用clearFragmentResultListener
在Lifecycle
已经STARTED
并且结果已经可用时不起作用的问题。( If7458)
版本 1.5.5
2022 年 12 月 7 日
androidx.fragment:fragment:1.5.5
、androidx.fragment:fragment-ktx:1.5.5
和 androidx.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.4
、androidx.fragment:fragment-ktx:1.5.4
和 androidx.fragment:fragment-testing:1.5.4
已发布。版本 1.5.4 包含这些提交。
Bug 修复
- 修复了当使用不实现提供程序回调接口(
OnConfigurationChangedProvider
、OnMultiWindowModeChangedProvider
、OnTrimMemoryProvider
、OnPictureInPictureModeChangedProvider
)的宿主时,使用自定义FragmentController
并调用其已弃用的分派函数会无法分派给子 Fragment 的错误。( I9b380)
版本 1.5.3
2022 年 9 月 21 日
androidx.fragment:fragment:1.5.3
、androidx.fragment:fragment-ktx:1.5.3
和 androidx.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.2
、androidx.fragment:fragment-ktx:1.5.2
和 androidx.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.1
、androidx.fragment:fragment-ktx:1.5.1
和 androidx.fragment:fragment-testing:1.5.1
已发布。版本 1.5.1 包含这些提交。
Bug 修复
- 修复了
DialogFragmentCallbacksDetector
中的回归,该回归导致使用与 AGP 7.4 捆绑的 Lint 版本时 Lint 崩溃。(b/237567009)
依赖项更新
- Fragment 库现在依赖于 Lifecycle
2.5.1
。( Id204c) - Fragment 库现在依赖于 Activity
1.5.1
。( I10f07)
版本 1.5.0
2022 年 6 月 29 日
androidx.fragment:fragment:1.5.0
、androidx.fragment:fragment-ktx:1.5.0
和 androidx.fragment:fragment-testing:1.5.0
已发布。版本 1.5.0 包含这些提交。
自 1.4.0 以来的重要更改
- CreationExtras 集成 -
Fragment
现在可以通过 Lifecycle2.5.0
的CreationExtras
提供无状态的ViewModelProvider.Factory
。 - 组件对话框集成 -
DialogFragment
现在通过 Activity1.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 已弃用。Activity1.4.0
中添加的MenuHost
和MenuProvider
API 提供了一个可测试、生命周期感知的等效 API 表面,Fragment 应该使用它们。
版本 1.5.0-rc01
2022 年 5 月 11 日
androidx.fragment:fragment:1.5.0-rc01
、androidx.fragment:fragment-ktx:1.5.0-rc01
和 androidx.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-beta01
、androidx.fragment:fragment-ktx:1.5.0-beta01
和 androidx.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-alpha05
、androidx.fragment:fragment-ktx:1.5.0-alpha05
和 androidx.fragment:fragment-testing:1.5.0-alpha05
。版本 1.5.0-alpha05 包含这些提交。
API 更改
Fragment
的setHasOptionsMenu()
已弃用。根据 Fragment1.5.0-alpha04
版本说明,应改用新的菜单 API 来管理菜单及其菜单项。( I7b4b4, b/226438239)
版本 1.5.0-alpha04
2022 年 3 月 23 日
发布了 androidx.fragment:fragment:1.5.0-alpha04
、androidx.fragment:fragment-ktx:1.5.0-alpha04
和 androidx.fragment:fragment-testing:1.5.0-alpha04
。版本 1.5.0-alpha04 包含这些提交。
API 更改
- 用于向 Activity 的
ActionBar
提供菜单的 Fragment API 已弃用,因为它们会将 Fragment 与 Activity 紧密耦合,并且无法单独进行测试。Activity1.4.0-alpha01
中添加的MenuHost
和MenuProvider
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-alpha03
、androidx.fragment:fragment-ktx:1.5.0-alpha03
和 androidx.fragment:fragment-testing:1.5.0-alpha03
。版本 1.5.0-alpha03 包含这些提交。
API 更改
- 您现在可以将
CreationExtras
传递给by viewModels()
和by activityViewModels()
函数。( Ibefe7, b/217601110)
行为变更
DialogFragment
现在将ComponentDialog
用作onCreateDialog()
返回的默认对话框。( If3784, b/217618170)
版本 1.5.0-alpha02
2022 年 2 月 9 日
发布了 androidx.fragment:fragment:1.5.0-alpha02
、androidx.fragment:fragment-ktx:1.5.0-alpha02
和 androidx.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-alpha01
、androidx.fragment:fragment-ktx:1.5.0-alpha01
和 androidx.fragment:fragment-testing:1.5.0-alpha01
。版本 1.5.0-alpha01 包含这些提交。
新功能
Fragment
现在与 Lifecycle2.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) - 修复了从
Fragment
的registerForActivityResult()
回调中首次访问ViewModel
时发生的崩溃。( Iea2b3)
版本 1.4
版本 1.4.1
2022 年 1 月 26 日
发布了 androidx.fragment:fragment:1.4.1
、androidx.fragment:fragment-ktx:1.4.1
和 androidx.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.0
、androidx.fragment:fragment-ktx:1.4.0
和 androidx.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-beta01
、androidx.fragment:fragment-ktx:1.4.0-beta01
和 androidx.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-alpha10
、androidx.fragment:fragment-ktx:1.4.0-alpha10
和 androidx.fragment:fragment-testing:1.4.0-alpha10
。版本 1.4.0-alpha10 包含这些提交。
Lint
- 添加了
DetachAndAttachFragmentInSameFragmentTransaction
lint 警告,用于检测在同一FragmentTransaction
中对同一个Fragment
同时调用detach()
和attach()
— 由于这些互补操作在同一事务中执行时会相互抵消,因此它们必须拆分为单独的事务才能实际执行任何操作。( aosp/1832956, b/200867930) - 添加了
FragmentAddMenuProvider
lint 错误,用于在使用MenuHost
的addMenuProvider
API 时,将 Fragment 生命周期更正为 Fragment 视图生命周期。( aosp/1830457, b/200326272)
文档更新
- 现在由 Activity Result API 处理的 API(即
startActivityForResult
、startIntentSenderForResult
、onActivityResult
、requestPermissions
和onRequestPermissionsResult
)的弃用消息都已扩展,包含更多详细信息。( cce80f) Fragment
和DialogFragment
的onActivityCreated()
弃用消息都已扩展,包含更多详细信息。( 224db4)
版本 1.4.0-alpha09
2021 年 9 月 15 日
发布了 androidx.fragment:fragment:1.4.0-alpha09
、androidx.fragment:fragment-ktx:1.4.0-alpha09
和 androidx.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-alpha08
、androidx.fragment:fragment-ktx:1.4.0-alpha08
和 androidx.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-alpha07
、androidx.fragment:fragment-ktx:1.4.0-alpha07
和 androidx.fragment:fragment-testing:1.4.0-alpha07
,没有显著变化。版本 1.4.0-alpha07 包含这些提交。
版本 1.4.0-alpha06
2021 年 8 月 4 日
发布了 androidx.fragment:fragment:1.4.0-alpha06
、androidx.fragment:fragment-ktx:1.4.0-alpha06
和 androidx.fragment:fragment-testing:1.4.0-alpha06
。版本 1.4.0-alpha06 包含这些提交。
Bug 修复
- 修复了多个返回栈的问题,当快速切换返回栈时,在恢复
FragmentTransaction
或出现 Fragment 的第二个副本时,可能会出现IllegalStateException
。( I9039f) - 修复了
FragmentManager
会保留之前通过saveBackStack()
保存的状态副本,即使该状态已恢复的问题。( Ied212) DialogFragment
的dismissAllowingStateLoss()
方法在您特别通过show(FragmentTransaction, String)
方法添加 DialogFragment 并在保存状态后调用它时,不再崩溃。( I84422)
版本 1.4.0-alpha05
2021 年 7 月 21 日
发布了 androidx.fragment:fragment:1.4.0-alpha05
、androidx.fragment:fragment-ktx:1.4.0-alpha05
和 androidx.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.6
:FragmentActivity
现在始终将其覆盖的生命周期回调中的第一个操作解锁已保存状态。( I6db7a)
依赖项更新
- 来自 Fragment
1.3.6
:Fragment 现在依赖于 Activity1.2.4
。( I3a66c)
版本 1.4.0-alpha04
2021 年 6 月 30 日
发布了 androidx.fragment:fragment:1.4.0-alpha04
、androidx.fragment:fragment-ktx:1.4.0-alpha04
和 androidx.fragment:fragment-testing:1.4.0-alpha04
。版本 1.4.0-alpha04 包含这些提交。
API 更改
FragmentManager
现在在内部使用SavedStateRegistry
来保存其状态。FragmentController
中的saveAllState()
和restoreSavedState()
方法也已弃用。如果您正在使用FragmentController
在FragmentActivity
之外托管 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-alpha03
、androidx.fragment:fragment-ktx:1.4.0-alpha03
和 androidx.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/1679887 在 Fragment1.3.4
中引入的共享元素过渡的回归。Fragment 现在正确处理过渡组(通过transitionGroup="true"
直接设置或通过transitionName
或background
间接设置)并且共享元素将不再抛出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-alpha02
、androidx.fragment:fragment-ktx:1.4.0-alpha02
和 androidx.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
已扩展为SetTargetFragmentUsageViolation
、GetTargetFragmentUsageViolation
和GetTargetFragmentRequestCodeUsageViolation
,其中SetTargetFragmentUsageViolation
包含目标 Fragment 和请求代码。( I741b4, b/187871150)SetUserVisibleHintViolation
现在包含传递给setUserVisibleHint()
的布尔值。( I00585, b/187871150)FragmentTagUsageViolation
现在包含<fragment>
标签尝试将 Fragment 膨胀到的 ViewGroup。( I5dbbc, b/187871150)FragmentReuseViolation
现在包含导致违规的Fragment
实例的前一个唯一 ID。( I0544d, b/187871150)RetainInstanceUsageViolation
现在是抽象类,并有两个子类:SetRetainInstanceUsageViolation
和GetRetainInstanceUsageViolation
,分别代表了两种违规类型。( Ic81e5, b/187871150)
行为变更
FragmentContainerView
现在在尝试通过编程或 XML 更改fitsSystemWindow
属性时会抛出异常。内边距应由每个 Fragment 的视图独立处理。( Ie6651, b/187304502)
版本 1.4.0-alpha01
2021 年 5 月 18 日
发布了 androidx.fragment:fragment:1.4.0-alpha01
、androidx.fragment:fragment-ktx:1.4.0-alpha01
和 androidx.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 更改
FragmentManager.enableNewStateManager(boolean)
的实验性 API 已移除,新状态管理器 现在是唯一可用的选项。( I90036, b/162776418)FragmentScenario
现在实现了Closeable
,允许您将其与 Kotlin 的use
方法或 try-with-resources 一起使用。( #121, b/143774122)
新的 Lint 检查
UseGetLayoutInflater
Lint 检查现在会在DialogFragment
中使用LayoutInflater.from(Context)
时发出警告——您应该始终使用 DialogFragment 的getLayoutInflater()
方法来获取适当的LayoutInflater
。( #156, b/170781346)DialogFragmentCallbacksDetector
Lint 检查现在会在DialogFragment
的onCreateDialog()
方法中调用setOnCancelListener
或setOnDismissListener
时发出警告——这些监听器由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 不再无限期分发,从而解决了BottomNavigationBar
和FloatingActionButton
实例的问题。( I1bb78, b/186012452) - 来自 Fragment 1.3.4:进程终止后,您现在可以从 Fragment 结果 Bundle 中检索 Parcelable。( I65932, b/187443158)
- 在 ViewGroup 上进行共享元素过渡时,如果 ViewGroup 的
transitionGroup
设置为 false,它现在将正确过渡。( I99675)
外部贡献
- 感谢 simonschiller 使
FragmentScenario
实现了Closeable
。( #121, b/143774122) - 感谢 simonschiller 为此版本添加了完整的
FragmentStrictMode
API!( #123, #131, #150, b/143774122, #142, b/153738653, #141, b/153738235, #146, b/181137036, #140, b/153737954, #136, b/153738974, #139, b/153737745) - 感谢 tatocaster 添加了
UseGetLayoutInflater
Lint 检查。( #156, b/170781346) - 感谢 tatocaster 添加了
DialogFragmentCallbacksDetector
Lint 检查。( #171, b/181780047)
版本 1.3
版本 1.3.6
2021 年 7 月 21 日
发布了 androidx.fragment:fragment:1.3.6
、androidx.fragment:fragment-ktx:1.3.6
和 androidx.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)
依赖项更新
- 来自 Fragment
1.3.6
:Fragment 现在依赖于 Activity1.2.4
。( I3a66c)
版本 1.3.5
2021 年 6 月 16 日
发布了 androidx.fragment:fragment:1.3.5
、androidx.fragment:fragment-ktx:1.3.5
和 androidx.fragment:fragment-testing:1.3.5
。版本 1.3.5 包含这些提交。
Bug 修复
- 修复了 aosp/1679887 在 Fragment
1.3.4
中引入的共享元素过渡的回归。Fragment 现在正确处理过渡组(通过transitionGroup="true"
直接设置或通过transitionName
或background
间接设置)并且共享元素将不再抛出IndexOutOfBoundsException
。( I16484, b/188679569, b/188969304)
版本 1.3.4
2021 年 5 月 18 日
发布了 androidx.fragment:fragment:1.3.4
、androidx.fragment:fragment-ktx:1.3.4
和 androidx.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 不再无限期分发,从而解决了BottomNavigationBar
和FloatingActionButton
实例的问题。( 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.3
、androidx.fragment:fragment-ktx:1.3.3
和 androidx.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.2
、androidx.fragment:fragment-ktx:1.3.2
和 androidx.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.1
、androidx.fragment:fragment-ktx:1.3.1
和 androidx.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)
setFragmentResult
和setFragmentResultListener
的文档已更新其参数文档,以反映它们不再接受可空值。( 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)
依赖项更新
- Fragment 1.3.1 依赖于 Activity
1.2.1
。( I557b9)
版本 1.3.0
2021 年 2 月 10 日
发布了 androidx.fragment:fragment:1.3.0
、androidx.fragment:fragment-ktx:1.3.0
和 androidx.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 才能在FragmentActivity
或AppCompatActivity
中使用 Activity Result API。
- 此版本修复了在
Fragment Result API:添加了通过
FragmentManager
上的新 API 在两个 Fragment 之间传递结果的支持。这适用于层次结构 Fragment(父/子)、DialogFragment 和 Navigation 中的 Fragment,并确保仅当您的 Fragment 至少处于STARTED
状态时才将结果发送给它。目标 Fragment API 已弃用,取而代之的是这些新的 API。请参阅使用 Fragment Result API 获取结果。FragmentOnAttachListener
:FragmentActivity
和Fragment
上的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
现在支持 Lifecycle2.3.0
和 SavedState1.1.0
中添加的ViewTreeLifecycleOwner.get(View)
、ViewTreeViewModelStoreOwner.get(View)
和ViewTreeSavedStateRegistryOwner
API,这样在使用 Fragment 中的View
时,它将返回 Fragment 作为ViewModelStoreOwner
,以及一个与 Fragment 的视图生命周期绑定的SavedStateRegistryOwner
和LifecycleOwner
。TRANSIT_
动画变更:Fragment 默认效果TRANSIT_FRAGMENT_OPEN
、TRANSIT_FRAGMENT_CLOSE
和TRANSIT_FRAGMENT_FADE
现在使用Animator
而不是Animation
。用于构建这些动画的资源现在是私有的。setRetainInstance()
弃用:Fragment 上的setRetainInstance()
方法已弃用。随着 ViewModels 的引入,开发者拥有了一个用于保留状态的特定 API,该状态可以与 Activity、Fragment 和导航图关联。这允许开发者使用正常的、未保留的 Fragment,并将他们希望保留的特定状态分开,从而避免常见的内存泄漏源,同时保持保留状态的单一创建和销毁的有用属性(即ViewModel
的构造函数及其接收到的onCleared()
回调)。ViewPager 1 适配器弃用:随着 ViewPager2
1.0.0
的发布,用于与ViewPager
交互的FragmentPagerAdapter
和FragmentStatePagerAdapter
类已弃用。请参阅从 ViewPager 迁移到 ViewPager2。
版本 1.3.0-rc02
2021 年 1 月 27 日
发布了 androidx.fragment:fragment:1.3.0-rc02
、androidx.fragment:fragment-ktx:1.3.0-rc02
和 androidx.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
的片段现在会按正确的顺序显示。(Id9aa3、b/176089197)
版本 1.3.0-rc01
2020 年 12 月 16 日
androidx.fragment:fragment:1.3.0-rc01
、androidx.fragment:fragment-ktx:1.3.0-rc01
和 androidx.fragment:fragment-testing:1.3.0-rc01
发布。版本 1.3.0-rc01 包含这些提交。
Bug 修复
onPrepareOptionsMenu()
现在遵循与onCreateOptionsMenu()
相同的逻辑,并且当父片段调用setMenuVisibility(false)
时不再被调用。(Id7de8、b/173203654)
新状态管理器错误修复
- 修复了将带
Animation
的片段添加到FragmentContainerView
中,然后通过弹出操作中断此添加时出现的泄漏和视觉伪影。(I952d8) - 修复了片段的视图如果在其
onCreate()
或onViewCreated()
方法期间被替换,则会保留在视图层次结构中的问题。(I8a7d5) - 现在,当片段的根视图恢复时,焦点会正确恢复。(Ifc84b)
- 在同一片段事务中合并弹出和替换操作现在将显示正确的动画。(Ifd4e4、b/170328691)
版本 1.3.0-beta02
2020 年 12 月 2 日
androidx.fragment:fragment:1.3.0-beta02
、androidx.fragment:fragment-ktx:1.3.0-beta02
和 androidx.fragment:fragment-testing:1.3.0-beta02
发布。版本 1.3.0-beta02 包含这些提交。
新功能
FragmentScenario
已完全转换为 Kotlin,同时通过使用 Kotlin 1.4 的FragmentAction
函数接口保持了源代码和二进制兼容性。(I19d31)
行为变更
- 不使用
class
或android:name
属性膨胀片段的 FragmentContainerViews 现在可以在FragmentActivity
之外使用。(Id4397、b/172266337) - 现在,尝试将片段的最大生命周期设置为
DESTROYED
将抛出IllegalArgumentException
。(Ie7651、b/170765622) - 现在,使用
DESTROYED
状态初始化 FragmentScenario 将抛出IllegalArgumentException
。(I73590、b/170765622)
新状态管理器错误修复
- 修复了在使用
Animator
或TRANSIT_FRAGMENT_
选项之一中断片段转换时,视图未达到最终状态的问题。(I92426、b/169874632) - 修复了阻止带有退出
Animation
的片段被正确销毁的问题。(I83d65) - 退出片段的效果被反转后,现在可以正确取消并以正确的进入效果重新启动。(I62226、b/167092035)
- 修复了
hide()
的退出Animator
不运行的问题。(Id7ffe) - 片段现在在延迟后立即启动时会正确显示。(Ie713b、b/170022857)
- 在动画期间移除其焦点视图的片段,一旦达到
RESUMED
状态,将不再尝试在分离的视图上恢复焦点。(I38c65、b/172925703)
外部贡献
FragmentFactory
现在为不同的ClassLoader
实例单独缓存片段类。感谢 Simon Schiller!(#87、b/113886460)
版本 1.3.0-beta01
2020 年 10 月 1 日
androidx.fragment:fragment:1.3.0-beta01
、androidx.fragment:fragment-ktx:1.3.0-beta01
和 androidx.fragment:fragment-testing:1.3.0-beta01
发布。版本 1.3.0-beta01 包含这些提交。
新功能
setMaxLifecycle()
现在支持将Lifecycle
状态设置为INITIALIZING
,只要片段尚未移动到CREATED
状态。(b/159662173)
API 更改
- 将 androidx 升级到 Kotlin 1.4。(Id6471、b/165307851、b/165300826)
行为变更
- 片段资源文件已正确设为私有。(aosp/1425237)
Bug 修复
- 使用
<fragment>
标签膨胀的片段现在会正确等待其视图添加到容器中,然后才会移动到 STARTED 状态。(I02f4c) - 可见然后通过
setMaxLifecycle()
设置为CREATED
的片段现在会正确运行其退出效果。(b/165822335) - 移除未添加到返回堆栈的已分离片段不再导致内存泄漏。感谢 Nicklas Ansman Giertz!(b/166489383)
- 活动片段现在始终具有非 null 的
FragmentManager
,并且具有非 nullFragmentManager
的片段将始终被视为活动状态。(aosp/1422346) - 片段默认效果
TRANSIT_FRAGMENT_OPEN
、TRANSIT_FRAGMENT_CLOSE
和TRANSIT_FRAGMENT_FADE
现在使用Animator
而不是Animation
。(b/166155034)
新状态管理器错误修复
- 片段现在可以正确地从动画开始前的状态恢复其视图焦点状态。(Icc256)
- 仅具有共享元素转换的片段现在可以正确完成其特殊效果,这意味着它们实际上移动到最终状态。(Iaebc7、b/166658128)
- 片段视图现在总是在销毁之前从容器中移除。(Id5876)
- 新的状态管理器现在始终在添加进入片段之前移除退出片段视图。(I41a6e)
- 新的状态管理器现在会尊重片段视图可见性的显式更改。这意味着,如果您在动画开始之前将进入片段的视图设置为
INVISIBLE
,它将实际保持不可见。(b/164481490) - 片段现在优先使用
Animators
而不是Animations
,这意味着同时包含两者中的一个片段将只运行Animator
并忽略Animation
。(b/167579557) - 新的状态管理器在使用进入动画时不再导致片段闪烁。(b/163084315)
已知问题
当使用新的状态管理器时,如果在进入特殊效果期间按下返回键而不是返回到上一个片段,旧片段永远不会被重新添加,导致空白屏幕。(b/167259187、b/167092035、b/168442830)
版本 1.3.0-alpha08
2020 年 8 月 19 日
androidx.fragment:fragment:1.3.0-alpha08
、androidx.fragment:fragment-ktx:1.3.0-alpha08
和 androidx.fragment:fragment-testing:1.3.0-alpha08
发布。版本 1.3.0-alpha08 包含这些提交。
新状态管理器
此版本包含对 FragmentManager
内部状态管理的主要重构,它影响生命周期方法的调度、动画和转换以及延迟事务的处理方式。此功能默认启用。有关更多详细信息,请参阅《Fragments: Rebuilding the Internals》博客文章。(b/139536619、b/147749580)
FragmentManager.enableNewStateManager(boolean)
中的一个实验性 API 可用于控制 FragmentManager 是否使用新的状态管理器。(I7b6ee)
以下问题仅在使用新的状态管理器时修复
- 现在,
replace
操作的先前片段在新片段启动之前会正确停止。(b/161654580) - 片段现在可以防止同一片段上的多个竞争动画,避免了
Animation
覆盖所有Transition
效果或单个片段上的Animator
和Transition
同时运行的情况。(b/149569323) - 现在,所有进入和退出片段的
enterTransition
和exitTranstion
都会运行,而不仅仅是最后一个进入片段和第一个退出片段。(b/149344150) - 延迟的片段不再停留在
CREATED
状态,而是与其他片段一起移动到STARTED
状态。(b/129035555) - 修复了当混合延迟重新排序事务和非重新排序事务时,
FragmentManager
会乱序执行操作的问题。(b/147297731) - 同时弹出多个片段在延迟片段时将不再导致中间片段暂时可见。(b/37140383)
- 现在,当从
onAttachFragment()
回调中调用findFragmentById()
或findFragmentByTag()
时,FragmentManager
会返回正确的片段。(b/153082833) - 当替换片段的片段被延迟时,片段不再在其销毁的片段上调用
onCreateView()
。(b/143915710) - 现在,当尝试合并框架
Transition
和 AndroidXTransition
实例时,错误消息会提及具有无效转换的片段。(b/155574969)
行为变更
- 您现在可以在片段的
onCreate()
生命周期方法中调用ActivityResultLauncher
上的launch()
。(b/161464278) - 现在,在
onCreate()
之后调用registerForActivityResult()
将抛出异常,指示不允许此操作,而不是在配置更改后默默地无法传递结果。(b/162255449) FragmentActivity
现在使用 Activity1.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-alpha07
、androidx.fragment:fragment-ktx:1.3.0-alpha07
和 androidx.fragment:fragment-testing:1.3.0-alpha07
发布。版本 1.3.0-alpha07 包含这些提交。
新功能
FragmentScenario
现在支持将初始生命周期状态设置为CREATED
、STARTED
或RESUMED
,而不是始终将片段移动到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-alpha06
、androidx.fragment:fragment-ktx:1.3.0-alpha06
和 androidx.fragment:fragment-testing:1.3.0-alpha06
发布。版本 1.3.0-alpha06 包含这些提交。
新功能
FragmentActivity
和Fragment
上的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-alpha05
、androidx.fragment:fragment-ktx:1.3.0-alpha05
和 androidx.fragment:fragment-testing:1.3.0-alpha05
发布。版本 1.3.0-alpha05 包含这些提交。
新功能
- 添加了对 Lifecycle
2.3.0-alpha03
中的ViewTreeViewModelStoreOwner
和 SavedState1.1.0-alpha01
中的ViewTreeSavedStateRegistryOwner
的支持,用于在Fragment
中使用View
时。(aosp/1297993、aosp/1300264)
API 更改
setFragmentResult()
和setFragmentResultListener()
API 现在分别接受非 null 的Bundle
和FragmentResultListener
。要明确清除先前设置的结果或监听器,请使用新的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-alpha04
、androidx.fragment:fragment-ktx:1.3.0-alpha04
和 androidx.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-alpha03
、androidx.fragment:fragment-ktx:1.3.0-alpha03
和 androidx.fragment:fragment-testing:1.3.0-alpha03
发布。版本 1.3.0-alpha03 包含这些提交。
API 更改
- 片段上的
prepareCall
方法现在是final
的。(b/152439361)
Bug 修复
- 修复了在 Fragment
1.3.0-alpha02
中引入的在使用BottomSheetDialogFragment
时出现的回归。(b/151652127、aosp/1263328、aosp/1265163) - 修复了在配置更改后从片段中调用
prepareCall
时崩溃的问题。(b/152137004) - 修复了在使用
setTargetFragment()
时共享元素和退出转换被忽略的问题。(b/152023196) - 来自 Fragment
1.2.4
:更新了片段 ProGuard 规则,以允许对保留的片段进行混淆。(b/151605338) - 来自 Fragment
1.2.4
:禁用了DialogFragment
类上的FragmentLiveDataObserve
Lint 规则,因为它们的生命周期和视图生命周期始终同步,因此在调用observe
时使用this
或viewLifecycleOwner
都是安全的。(b/151765086)
依赖项更改
- 片段依赖于 Activity
1.2.0-alpha03
,后者在 Activity1.2.0-alpha02
中引入的 Activity Result API 方面有显著改进。
版本 1.3.0-alpha02
2020 年 3 月 18 日
androidx.fragment:fragment:1.3.0-alpha02
、androidx.fragment:fragment-ktx:1.3.0-alpha02
和 androidx.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/117894767、aosp/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-alpha01
、androidx.fragment:fragment-ktx:1.3.0-alpha01
和 androidx.fragment:fragment-testing:1.3.0-alpha01
发布。版本 1.3.0-alpha01 包含这些提交。
新功能
- 增加了对 Lifecycle
2.3.0-alpha01
中添加的ViewTreeLifecycleOwner.get(View)
API 的支持,以便它将片段的viewLifecycleOwner
作为onCreateView()
返回的任何视图的LifecycleOwner
返回。(aosp/1182955)
API 更改
- 片段上的
setRetainInstance()
方法已被弃用。随着 ViewModels 的引入,开发者有了一个特定的 API 来保留可以与 Activity、Fragment 和 Navigation 图关联的状态。这允许开发者使用正常的、未保留的片段,并保持他们想要保留的特定状态分离,从而避免了常见的泄漏源,同时保持了保留状态的单一创建和销毁的有用属性(即ViewModel
的构造函数及其接收的onCleared()
回调)。(b/143911815) - 随着 ViewPager2
1.0.0
的发布,用于与ViewPager
交互的FragmentPagerAdapter
和FragmentStatePagerAdapter
类已被弃用。请参阅从 ViewPager 迁移到 ViewPager2。(b/145132715)
Bug 修复
- 片段 ProGuard 规则现在正确地只保留正在使用的
Fragment
类的默认构造函数,而不是所有Fragment
实例,修复了在 Fragment1.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.5
、androidx.fragment:fragment-ktx:1.2.5
和 androidx.fragment:fragment-testing:1.2.5
发布。版本 1.2.5 包含这些提交。
Bug 修复
- 片段的
getViewLifecycleOwner()
现在在调用onSaveInstanceState()
之前停止,这与片段生命周期的行为一致。此功能先前已在 Fragment1.3.0-alpha04
中发布。(b/154645875) - 在片段上调用
setMenuVisibility(false)
现在可以正确更改其子片段提供的菜单的可见性。此功能先前已在 Fragment1.3.0-alpha04
中发布。(b/153593580)
版本 1.2.4
版本 1.2.4
2020 年 4 月 1 日
androidx.fragment:fragment:1.2.4
、androidx.fragment:fragment-ktx:1.2.4
和 androidx.fragment:fragment-testing:1.2.4
发布。版本 1.2.4 包含这些提交。
Bug 修复
- 更新了片段 ProGuard 规则,以允许对保留的片段进行混淆。(b/151605338)
- 禁用了
DialogFragment
类上的FragmentLiveDataObserve
Lint 规则,因为它们的生命周期和视图生命周期始终同步,因此在调用observe
时使用this
或viewLifecycleOwner
都是安全的。(b/151765086)
版本 1.2.3
版本 1.2.3
2020 年 3 月 18 日
androidx.fragment:fragment:1.2.3
、androidx.fragment:fragment-ktx:1.2.3
和 androidx.fragment:fragment-testing:1.2.3
发布。版本 1.2.3 包含这些提交。
Bug 修复
- 修复了
DialogFragment
中的一个错误,该错误导致在onCreateDialog()
中调用getLayoutInflater()
时出现StackOverflowError
。(b/117894767、aosp/1258665) - 缩小了 Fragment 包含的 ProGuard 规则的范围,以确保可以剥离未使用的 Fragment 类。(b/149665169)
- 修复了在使用遮蔽 Kotlin 属性名称的局部变量名称时,
UseRequireInsteadOfGet
Lint 检查中出现的误报。(b/149891163) FragmentContainerView
不再因为在布局预览中使用不正确的构造函数而抛出UnsupportedOperationException
。(b/149707833)
版本 1.2.2
版本 1.2.2
2020 年 2 月 19 日
androidx.fragment:fragment:1.2.2
、androidx.fragment:fragment-ktx:1.2.2
和 androidx.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) - 对于所有包含
get
和require
等效项的片段 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.1
、androidx.fragment:fragment-ktx:1.2.1
和 androidx.fragment:fragment-testing:1.2.1
发布。版本 1.2.1 包含这些提交。
错误修复
- 通过接受
Class
实例(或 Kotlin 具化版本)的add
和replace
方法添加的片段现在,它们的默认构造函数被 ProGuard 保留。(b/148181315) FragmentStatePagerAdapter
和FragmentPagerAdapter
在运行finishUpdate()
时不再捕获FragmentManager
抛出的异常。(aosp/1208711)- 修复了
FragmentManager.findFragment()
不适用于通过<fragment>
标签添加的片段的问题。(b/147784323) - 现在,使用
<fragment>
标签膨胀的片段在布局中时,总是在onCreate()
之前接收到onInflate()
的调用。(aosp/1215856) - 当 Activity 已销毁时,在
FragmentManager
实例上调用toString()
不再抛出NullPointerException
。(b/148189412)
依赖项更改
- Fragments
1.2.1
现在依赖于 Lifecycle ViewModel SavedState2.2.0
。
版本 1.2.0
版本 1.2.0
2020 年 1 月 22 日
androidx.fragment:fragment:1.2.0
、androidx.fragment:fragment-ktx:1.2.0
和 androidx.fragment:fragment-testing:1.2.0
发布。版本 1.2.0 包含这些提交。
自 1.1.0 以来的重要更改
- FragmentContainerView:
FragmentContainerView
是动态添加片段的强烈推荐容器,取代了FrameLayout
或其他布局的使用。它还支持与<fragment>
标签相同的class
、android:name
和可选的android:tag
,但使用正常的FragmentTransaction
来添加此初始片段,而不是<fragment>
标签使用的自定义代码路径。 onDestroyView()
时机:片段现在会等待退出动画、退出框架转换和退出 AndroidX 转换(当使用 Transition1.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()
方法,该方法返回片段添加到的非 nullFragmentManager
(您可以使用isAdded()
来确定是否可以安全调用)。FragmentManager.enableDebugLogging()
弃用:静态FragmentManager.enableDebugLogging
方法已被弃用。FragmentManager 现在遵循标签FragmentManager
的Log.isLoggable()
,允许您启用DEBUG
或VERBOSE
日志记录而无需重新编译您的应用。
已知问题
- 仅通过
FragmentContainerView
上的class
或android:name
属性引用的片段不会被 ProGuard 自动保留,需要您手动为每个片段类添加保留规则。(b/142601969) - 在使用 XML 中的
class
或android:name
与FragmentContainerView
添加NavHostFragment
时,您不能在 Activity 的onCreate()
中使用findNavController()
。(b/142847973)
版本 1.2.0-rc05
2020 年 1 月 8 日
androidx.fragment:fragment:1.2.0-rc05
、androidx.fragment:fragment-ktx:1.2.0-rc05
和 androidx.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-rc04
、androidx.fragment:fragment-ktx:1.2.0-rc04
和 androidx.fragment:fragment-testing:1.2.0-rc04
发布。版本 1.2.0-rc04 包含这些提交。
错误修复
- 调整了
TRANSIT_FRAGMENT_OPEN
、TRANSIT_FRAGMENT_CLOSE
和TRANSIT_FRAGMENT_FADE
的动画,以避免视觉问题。(b/145468417)
版本 1.2.0-rc03
2019 年 12 月 4 日
androidx.fragment:fragment:1.2.0-rc03
、androidx.fragment:fragment-ktx:1.2.0-rc03
和 androidx.fragment:fragment-testing:1.2.0-rc03
发布。版本 1.2.0-rc03 包含这些提交。
错误修复
- 修复了一个意外的行为更改:被移除的片段在退出动画/转换运行时仍被
findFragmentById()
/findFragmentByTag()
返回。(b/143982969、aosp/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 SavedState1.0.0-rc03
和 Activity1.1.0-rc03
。
版本 1.2.0-rc02
2019 年 11 月 7 日
androidx.fragment:fragment:1.2.0-rc02
、androidx.fragment:fragment-ktx:1.2.0-rc02
和 androidx.fragment:fragment-testing:1.2.0-rc02
发布。版本 1.2.0-rc02 包含这些提交。
错误修复
- 在 Kotlin 中,当在
onCreateView()
、onViewCreated()
或onActivityCreated()
中观察LiveData
时使用getViewLifecycleOwner()
的 LintFix(在 Fragment1.2.0-rc01
中引入)现在使用 Kotlin 属性访问语法viewLifecycleOwner
而不是getViewLifecycleOwner()
。(aosp/1143821)
版本 1.2.0-rc01
2019 年 10 月 23 日
androidx.fragment:fragment:1.2.0-rc01
、androidx.fragment:fragment-ktx:1.2.0-rc01
和 androidx.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
上的onDismiss
和onCancel
回调现在保证传递给它们的DialogInterface
是非 null 的,并且在它们执行时getDialog()
返回非 null。(b/141974033)FragmentContainerView
现在将由class
或android:name
定义的片段作为膨胀的一部分添加,确保findFragmentById()
和findFragmentByTag()
在此之后立即工作。(b/142520327)- 修复了
FragmentContainerView
中由于状态保存而导致的IllegalStateException
。(b/142580713) - 修复了当
FragmentContainerView
类被混淆时,FragmentContainerView
中出现UnsupportedOperationException
的问题。(b/142657034)
已知问题
- 仅通过
FragmentContainerView
上的class
或android:name
属性引用的片段不会被 ProGuard 自动保留,需要您手动为每个片段类添加保留规则。我们已禁用建议移动到FragmentContainerView
的 Lint 规则,直到通过aapt2
解决此问题。(b/142601969)
版本 1.2.0-beta02
2019 年 10 月 11 日
androidx.fragment:fragment:1.2.0-beta02
、androidx.fragment:fragment-ktx:1.2.0-beta02
和 androidx.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-beta01
、androidx.fragment:fragment-ktx:1.2.0-beta01
和 androidx.fragment:fragment-testing:1.2.0-beta01
发布。版本 1.2.0-beta01 包含这些提交。
新功能
FragmentContainerView
增加了对添加初始片段的支持,并增加了对android:name
和可选的android:tag
XML 属性的支持。与<fragment>
标签不同,FragmentContainerView
在底层使用正常的FragmentTransaction
来添加初始片段,允许在FragmentContainerView
上进行进一步的FragmentTransaction
操作,并支持布局的视图绑定。(b/139830628、b/141177981)- 片段现在包含一个 Lint 警告,提供一个快速修复程序,将
<fragment>
替换为FragmentContainerView
。(b/139830056)
错误修复
- 修复了在使用
androidx.transition
时出现的ClassCastException
。(b/140680619) - 当使用 Transition
1.3.0-beta01
时,片段现在会等待androidx.transition
转换(以及框架转换和动画,它们分别在 Fragment1.2.0-alpha03
和 Fragment1.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 Test1.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-alpha04
、androidx.fragment-ktx:example:1.2.0-alpha04
和 androidx.fragment:fragment-testing:1.2.0-alpha04
发布。版本 1.2.0-alpha04 包含这些提交。
API 更改
- 片段上的
getFragmentManager()
和requireFragmentManager()
方法已被弃用,并替换为单个getParentFragmentManager()
方法,该方法返回片段添加到的非 nullFragmentManager
(您可以使用isAdded()
来确定是否可以安全调用)。(b/140574496) - 静态
FragmentManager.enableDebugLogging
方法已被弃用。FragmentManager 现在遵循标签FragmentManager
的Log.isLoggable()
,允许您启用DEBUG
或VERBOSE
日志记录而无需重新编译您的应用。(aosp/1116591)
错误修复
- 片段现在在其他片段的退出动画运行时正确销毁。(b/140574199)
- 修复了片段调用
Activity.findViewById()
的问题,而在此之前它没有这样做。(aosp/1116431)
版本 1.2.0-alpha03
2019 年 9 月 5 日
androidx.fragment:fragment:1.2.0-alpha03
、androidx.fragment:fragment-ktx:1.2.0-alpha03
和 androidx.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-alpha02
、androidx.fragment:fragment-ktx:1.2.0-alpha02
和 androidx.fragment:fragment-testing:11.2.0-alpha02
发布。此版本中包含的提交可在此处找到。
新功能
SavedStateViewModelFactory
现在是使用by viewModels()
、by activityViewModels()
、ViewModelProvider
构造函数或ViewModelProviders.of()
与Fragment
一起使用的默认工厂。(b/135716331)- 使用
FragmentTransaction
上的setTransition
时,TRANSIT_FRAGMENT_OPEN
、TRANSIT_FRAGMENT_CLOSE
、TRANSIT_FRAGMENT_FADE
的默认动画已更新,以匹配 Android 10 设备上活动使用的动画。(aosp/1012812、aosp/1014730)
API 更改
- 引入了
FragmentContainerView
作为动态添加片段的强烈推荐容器,取代了FrameLayout
等的使用,因为它修复了动画 z 轴排序问题和向片段调度窗口内边距的问题。(b/37036000、aosp/985243、b/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)FragmentTransaction
和FragmentManager.BackStackEntry
上与面包屑标题相关的 API 已弃用。(b/138252944)FragmentTransaction
上的setTransitionStyle
方法已弃用。(aosp/1011537)FragmentManager
中的许多方法不再是abstract
。FragmentManager
本身仍然是abstract
,不应直接实例化或扩展;您应继续仅从getSupportFragmentManager()
、getChildFragmentManager()
等处获取现有实例。
错误修复
- 自 Fragment
1.1.0-rc04
:Fragment 现在在弹出的 Fragment 上正确取消推迟的过渡。 (b/138251858) - 自 Fragment
1.1.0-rc03
:修复了多次调用postponeEnterTransition()
并设置超时后,无法取消之前超时的问题。 (b/137797118) - 自 Fragment
1.1.0-rc02
:修复了在移除当前项时,FragmentPagerAdapter
和FragmentStatePagerAdapter
中发生的崩溃问题。 (b/137209870) - Fragment 现在会在动画完成之后再分派
onDestroyView()
。 (b/136110528) - 现在,当父 Fragment 播放动画时,子 Fragment 及其后代的 Fragment 动画会得到妥善处理。 (b/116675313)
- 修复了在使用共享元素过渡并结合了弹出和添加操作时,出现的
NullPointerException
。 (b/120507394) - 添加了一种变通方法,以解决在 Robolectric 测试中使用
FragmentPagerAdapter
和FragmentStatePagerAdapter
时出现的IllegalStateException
。 (b/137201343)
版本 1.2.0-alpha01
2019 年 7 月 2 日
androidx.fragment:fragment:1.2.0-alpha01
、androidx.fragment:fragment-ktx:1.2.0-alpha01
和 androidx.fragment:fragment-testing:1.2.0-alpha01
已发布。此版本中包含的提交可在此处找到。
新功能
- FragmentManager 现在会在附加 Fragment 的视图之后和调用
onViewCreated()
之前直接调用requestApplyInsets()
,以确保您的视图始终具有正确的边衬区。 (b/135945162)
错误修复
- 修复了在弹出
FragmentTransaction
时,如果FragmentTransaction
在replace()
之前使用了setPrimaryNavigationFragment()
,就会出现NullPointerException
的问题。 (b/134673465)
版本 1.1.0
版本 1.1.0
2019 年 9 月 5 日
androidx.fragment:fragment:1.1.0
、androidx.fragment:fragment-ktx:1.1.0
和 androidx.fragment:fragment-testing:1.1.0
已发布。此版本中包含的提交可在此处找到。
自 1.0.0 以来的重要更改
- fragment-testing:
fragment-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()
。FragmentPagerAdapter
和FragmentStatePagerAdapter
有一个新的构造函数,可让您切换到新的行为。 - 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-rc04
、androidx.fragment:fragment-ktx:1.1.0-rc04
和 androidx.fragment:fragment-testing:1.1.0-rc04
已发布。此版本中包含的提交可在此处找到。
错误修复
- Fragment 现在在弹出的 Fragment 上正确取消推迟的过渡。 (b/138251858)
版本 1.1.0-rc03
2019 年 7 月 19 日
androidx.fragment:fragment:1.1.0-rc03
、androidx.fragment:fragment-ktx:1.1.0-rc03
和 androidx.fragment:fragment-testing:1.1.0-rc03
已发布。此版本中包含的提交可在此处找到。
错误修复
- 修复了多次调用
postponeEnterTransition()
并设置超时后,无法取消之前超时的问题。 (b/137797118)
版本 1.1.0-rc02
2019 年 7 月 17 日
androidx.fragment:fragment:1.1.0-rc02
、androidx.fragment:fragment-ktx:1.1.0-rc02
和 androidx.fragment-testing:fragment:1.1.0-rc02
已发布。此版本中包含的提交可在此处找到。
错误修复
- 修复了在移除当前项时,
FragmentPagerAdapter
和FragmentStatePagerAdapter
中发生的崩溃问题。 (b/137209870)
版本 1.1.0-rc01
2019 年 7 月 2 日
androidx.fragment:fragment:1.1.0-rc01
、androidx.fragment:fragment-ktx:1.1.0-rc01
和 androidx.fragment:fragment-testing:1.1.0-rc01
已发布。此版本中包含的提交可在此处找到。
错误修复
- 现在,当过渡正在运行时,Fragment 在使用
show()
或hide()
操作时会正确更新其可见性。 (b/133385058) - 修复了在弹出
FragmentTransaction
时,如果FragmentTransaction
在replace()
之前使用了setPrimaryNavigationFragment()
,就会出现NullPointerException
的问题。 (b/134673465)
版本 1.1.0-beta01
2019 年 6 月 5 日
androidx.fragment:fragment:1.1.0-beta01
、androidx.fragment:fragment-ktx:1.1.0-beta01
和 androidx.fragment:fragment-testing:1.1.0-beta01
已发布。此版本中包含的提交可在此处找到。
错误修复
- 嵌套 Fragment 的
androidx.lifecycle.Lifecycle
回调(特别是与STARTED
、RESUMED
、PAUSED
、STOPPED
和DESTROYED
相关的回调)现在已正确嵌套。 (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-alpha09
、androidx.fragment:fragment-ktx:1.1.0-alpha09
和 androidx.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-alpha08
、androidx.fragment:fragment-ktx:1.1.0-alpha08
和 androidx.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 - 重大变更:
FragmentPagerAdapter
和FragmentStatePagerAdapter
中的常量RESUME_ONLY_CURRENT_FRAGMENT
和USE_SET_USER_VISIBLE_HINT
已分别重命名为BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT
和BEHAVIOR_SET_USER_VISIBLE_HINT
。 aosp/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-alpha07
、androidx.fragment:fragment-ktx:1.1.0-alpha07
和 androidx.fragment:fragment-testing:1.1.0-alpha07
已发布。此版本中包含的提交可在此处找到。
新功能
- 您现在可以通过调用
FragmentTransaction
上的setMaxLifecycle()
来为 Fragment 设置最大生命周期状态。这取代了现在已弃用的setUserVisibleHint()
。FragmentPagerAdapter
和FragmentStatePagerAdapter
有一个新的构造函数,可让您切换到新的行为。 (b/129780800)
API 更改
FragmentScenario
上的moveToState(STARTED)
现在只能在 API 24+ 设备上调用。 (b/129880016)
行为变更
- 由于 (b/129907905),返回栈中的 Fragment 在宿主 Activity 重新创建时将**不会**收到对
onCreateView()
的回调。onCreateView()
现在仅在 Fragment 变为可见时(即,返回栈弹出时)才会调用。
错误修复
- 修复了在 XML 中使用
<fragment>
标记以及FragmentActivity
或AppCompatActivity
的contentLayoutId
构造函数时出现的问题。 (b/129907905) - 纠正了返回栈中的 Fragment 在配置更改后不会至少移动到
CREATED
的问题,这会导致 ViewModel 和子保留 Fragment 无法正确处置。 (b/129593351) - 修复了在实例状态保存后,保留的 Fragment 不同步导致的
restoreSaveState
中的崩溃。 (b/130433793) (aosp/947824) - 修复了在使用 Fragment 生命周期添加的
OnBackPressedCallback
在FragmentManager
存在返回栈时不会被调用的问题。如需了解详情,请参阅 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-alpha06
、androidx.fragment:fragment-ktx:1.1.0-alpha06
和 androidx.fragment:fragment-testing:1.1.0-alpha06
已发布。此版本中包含的提交可在此处找到。
新功能
- 现在,FragmentManager 抛出的异常会在消息中包含 Fragment 的名称。 (b/67759402)
API 更改
Fragment
和FragmentActivity
现在包含第二个构造函数,该构造函数接受一个@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-alpha05
、androidx.fragment:fragment-ktx:1.1.0-alpha05
和 androidx.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()
时,DialogFragment
的onDismiss()
可能会被调用两次的问题。 (b/126563750)
版本 1.1.0-alpha04
2019 年 2 月 7 日
androidx.fragment:fragment 1.1.0-alpha04
、androidx.fragment:fragment-ktx 1.1.0-alpha04
和 androidx.fragment:fragment-testing 1.1.0-alpha04
已发布。
新功能
- 增加了对
@ContentView
类注解的支持,该注解允许您指定应膨胀哪个布局 XML 文件,作为重写onCreateView()
的替代方法。建议在onViewCreated()
中执行视图相关工作。 (aosp/837619) fragment-testing
现在依赖于androidx.test:core-ktx
1.1.0 稳定版本 (b/121209673)- 您现在可以将
openActionBarOverflowOrOptionsMenu
与FragmentScenario
一起使用,以测试 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
。