Fragment
最近更新时间 | 稳定版 | 候选版 | Beta 版 | Alpha 版 |
---|---|---|---|---|
2024 年 10 月 30 日 | 1.8.5 | - | - | - |
声明依赖项
如需添加 Fragment 的依赖项,您必须将 Google Maven 制品库添加到项目中。如需了解详情,请参阅 Google 的 Maven 制品库。
在应用或模块的 build.gradle
文件中添加所需工件的依赖项:
Groovy
dependencies { def fragment_version = "1.8.5" // 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.5" // 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") }
如需详细了解依赖项,请参阅添加 build 依赖项。
反馈
您的反馈将帮助我们改进 Jetpack。如果您发现了新问题,或对此库有任何改进建议,请告诉我们。创建新问题前,请先查看此库中的现有问题。您可以点击星标按钮,为现有问题投票。
如需了解详情,请参阅问题跟踪器文档。
版本 1.8
版本 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 转场效果时,快速按系统返回按钮或快速执行返回手势会导致 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) - 如果在包含的 activity/fragment 的状态已保存时将
AndroidFragment
添加到组合,AndroidFragment
不再崩溃。(I985e9、b/356643968)
版本 1.8.2
2024 年 7 月 24 日
发布了 androidx.fragment:fragment-*:1.8.2
。版本 1.8.2 包含这些提交内容。
bug 修复
AndroidFragment
现在可以正确处理将父 fragment 放置在 fragment 返回堆栈上的情况,从而避免在弹回到该 fragment 时出现“找不到 ID 对应的视图”问题。(I94608)- 现在,通过可获取
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 或 Seekable Androidx Transition 的事务运行。这修复了取消部分可跳转的交易会导致黑屏的问题。(I43037、b/339169168)
版本 1.8.0-alpha02
2024 年 4 月 17 日
发布了 androidx.fragment:fragment-*:1.8.0-alpha02
。版本 1.8.0-alpha02 包含这些提交内容。
bug 修复
- 从 Fragment
1.7.0-rc02
开始:添加了日志,以指明在没有任何其他转场的情况下设置sharedElement
会导致运行失败的原因。(Iec48e) - 从 Fragment
1.7.0-rc02
开始:修复了以下 bug:如果将不可查找的共享元素添加到所有其他转换均可查找的事务中,则会导致崩溃。现在,系统会正确地将该事务视为不可跳转。(I18ccd)
版本 1.8.0-alpha01
2024 年 4 月 3 日
发布了 androidx.fragment:fragment-*:1.8.0-alpha01
。版本 1.8.0-alpha01 中包含这些提交内容。
新功能
- 借助新的
AndroidFragment
Composable
,您可以通过 fragment 类名称将 fragment 添加到 Compose 层次结构中。它会自动处理 Fragment 状态的保存和恢复。这可以直接替换 AndroidViewBindingComposable
。b/312895363、Icf841
文档变更
- 更新了
OnBackStackChangedListener
API 的文档,指明了何时调用这些 API 以及应如何使用这些 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 转场效果时,预测性返回才会运行。这修复了取消部分可查找的事务会导致空白屏幕的问题。(I43037、b/339169168)
版本 1.7.0
2024 年 5 月 1 日
发布了 androidx.fragment:fragment-*:1.7.0
。版本 1.7.0 包含这些提交内容。
支持预测性返回手势
- fragment 现在支持在使用
Animator
或 AndroidX Transition 1.5.0 时实现预测性应用内返回。这样,用户就可以使用返回手势来查看之前的 fragment,方法是通过查找您的 Animator/Transition,然后再决定是通过完成手势提交事务,还是取消事务。
过渡系统 | XML 资源 | 支持预测性返回 |
---|---|---|
Animation |
R.anim |
否 |
Animator |
R.animator |
是 |
框架 Transition |
R.transition |
否 |
采用 Transition 1.4.1 或更低版本的 AndroidX Transition |
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
,让您能够更轻松地将 Compose 用于单个 fragment 的界面。
class ExampleFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
) = content {
// Write your @Composable content here
val viewModel: ExampleViewModel = viewModel()
// or extract it into a separate, testable method
ExampleComposable(viewModel)
}
}
版本 1.7.0-rc02
2024 年 4 月 17 日
发布了 androidx.fragment:fragment-*:1.7.0-rc02
。版本 1.7.0-rc02 中包含这些提交内容。
bug 修复
- 添加了日志,以指明在没有任何其他转换的情况下设置
sharedElement
为何会失败。(Iec48e) - 修复了以下 bug:如果将不可跳转的共享元素添加到所有其他转场效果均可跳转的事务中,则会发生崩溃。现在,事务将被正确视为不可查找。(I18ccd)
版本 1.7.0-rc01
2024 年 4 月 3 日
发布了 androidx.fragment:fragment-*:1.7.0-rc01
。版本 1.7.0-rc01 包含这些提交内容。
依赖项更新
- 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 泛型类型的可为 null 性会与onGetHost()
返回类型的可为 null 性匹配。(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 版本中的一个已知问题:如果使用 Fragment 的预测性返回支持来处理
Animator
或 AndroidX 转换,并且从未通过addOnBackStackChangedListener
添加过FragmentManager.OnBackStackChangedListener
,则 fragment 会从handleOnBackProgressed
抛出NullPointerException
。(I7c835)
版本 1.7.0-alpha09
2024 年 1 月 24 日
发布了 androidx.fragment:fragment-*:1.7.0-alpha09
。版本 1.7.0-alpha09 中包含这些提交内容。
Fragment Compose 工件
创建了一个新的 fragment-compose
工件,该工件侧重于支持正在从基于 fragment 的架构迁移到完全基于 Compose 的架构的应用。
这个新工件中提供的第一个功能是 Fragment
上的 content
扩展方法,旨在通过为您创建一个 ComposeView
并设置正确的 ViewCompositionStrategy
,让您能够更轻松地将 Compose 用于单个 fragment 的界面。(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)
已知问题
- 针对
Animator
或 AndroidX 转换使用 fragment 的预测性返回支持时,如果从未通过addOnBackStackChangedListener
添加FragmentManager.OnBackStackChangedListener
,fragment 将从handleOnBackProgressed
抛出NullPointerException
。手动添加监听器可解决崩溃问题。Fragments 的下一版本将提供此问题的修复程序。
版本 1.7.0-alpha08
2024 年 1 月 10 日
发布了 androidx.fragment:fragment-*:1.7.0-alpha08
。版本 1.7.0-alpha08 中包含这些提交内容。
清理
- 移除了针对 Transition
1.5.0-alpha06
中已修复的过渡库的权宜解决方法。(I04356)
版本 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)。(I1e44c、b/307427423) - 从 Fragment
1.6.2
开始:使用clearBackStack
移除一组 fragment 时,现在当父 fragment 的ViewModels
被清除时,任何嵌套 fragment 的ViewModel
也会被清除。(I6d83c、b/296173018)
版本 1.7.0-alpha06
2023 年 10 月 4 日
发布了 androidx.fragment:fragment-*:1.7.0-alpha06
。版本 1.7.0-alpha06 中包含这些提交内容。
依赖项更新
- Fragment 已更新为依赖于 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 中包含这些提交内容。
新功能
- fragment 现在在使用 Androidx 转场效果时支持预测性返回。这样,您就可以使用返回手势通过自定义 Androidx 转换跳转到上一个 fragment,然后再决定是通过完成的手势提交还是取消事务。您必须依赖 Transition
1.5.0-alpha03
版本才能启用此功能。(Ib49b4、b/285175724)
已知问题
- 目前存在一个问题,即在您取消一次带有过渡效果的返回手势后,下次启动返回手势时,系统将无法运行过渡效果,导致屏幕空白。这可能是由转场效果库中的某个问题造成的。(b/300157785)。如果您遇到此问题,请针对 Fragment 提交问题,并附上可重现问题的示例项目。您可以在 activity 的
onCreate()
中使用FragmentManager.enabledPredictiveBack(false)
来停用预测性返回。
版本 1.7.0-alpha04
2023 年 9 月 6 日
发布了 androidx.fragment:fragment-*:1.7.0-alpha04
。版本 1.7.0-alpha04 中包含这些提交内容。
bug 修复
- 修复了取消预测性返回手势时 fragment 无法进入正确生命周期状态的问题。(I7cffe、b/297379023)
- 修复了允许动画与转场效果一起运行的回归问题。(I59f36)
- 修复了将预测性返回与 fragment 一起使用时,尝试在返回堆栈上的倒数第二个 fragment 中连续快速返回两次会导致崩溃的问题。(Ifa1a4)
版本 1.7.0-alpha03
2023 年 8 月 23 日
发布了 androidx.fragment:fragment-*:1.7.0-alpha03
。版本 1.7.0-alpha03 中包含这些提交内容。
bug 修复
- 修复了使用预测性返回时 Fragment 出现的问题,该问题会导致通过 3 键导航或预测性返回手势使用系统返回时,跳过 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 修复
- 将 Fragment 与 API 34 中的预测性返回手势结合使用时,如果您使用的过渡系统不支持跳转(
Animations
、Transitions
)或根本没有过渡,Fragment 现在会等到手势完成后再执行返回操作。(I8100c)
版本 1.7.0-alpha01
2023 年 6 月 7 日
发布了 androidx.fragment:fragment-*:1.7.0-alpha01
。此版本是在内部分支中开发的。
新功能
- 现在,使用
Animator
时,fragment 支持预测性应用内返回。这样,您就可以使用返回手势通过自定义 Animator 查看上一个 fragment,然后再决定通过已完成的手势提交事务,还是取消。您还可以使用实验性enablePredictiveBack()
并传入false
来停用此新行为。
版本 1.6
版本 1.6.2
2023 年 11 月 1 日
发布了 androidx.fragment:fragment-*:1.6.2
。版本 1.6.2 中包含这些提交内容。
bug 修复
- 当
FragmentContainerView
的 fragment 膨胀时,现在可以在onInflate
回调中访问其状态(例如FragmentManager
、Host 和 id)。(I1e44c、b/307427423) - 使用
clearBackStack
移除一组 fragment 时,现在在清除父 fragment 的ViewModels
时,系统也会清除任何嵌套 fragment 的ViewModel
。(I6d83c、b/296173018)
版本 1.6.1
2023 年 7 月 26 日
发布了 androidx.fragment:fragment-*:1.6.1
。版本 1.6.1 中包含这些提交内容。
bug 修复
- 修复了以下问题:在 activity 停止但未销毁时存储的已保存状态会被错误地缓存,即使 fragment 实例已移回
RESUMED
状态也是如此。如果使用多个返回堆栈 API 保存和恢复该 fragment 时,该 fragment 实例位于返回堆栈中,则会导致重复使用该缓存状态。(I71288、b/246289075)
依赖项更新
- fragment 现在依赖于 Activity 1.7.2。这修复了以下问题:如果 Kotlin 用户未明确依赖于 activity,则无法扩展
ComponentDialog
。(b/287509323)
版本 1.6.0
2023 年 6 月 7 日
发布了 androidx.fragment:fragment-*:1.6.0
。版本 1.6.0 中包含这些提交内容。
自 1.5.0 以来的重要变更
Fragment
的已保存状态已完全拆分为两种类型,一种是专用库状态(自定义Parcelable
类),另一种是开发者提供的状态,后者现在一律存储在Bundle
中,可用于确定 fragment 状态的确切来源。FragmentManager.OnBackStackChangedListener
接口进行了扩展,新增了onBackStackChangeStarted
和onBackStackChangeCommitted
的两个回调,分别在向 fragment 返回堆栈添加/移除之前和提交事务后立即使用每个Fragment
进行调用。FragmentStrictMode
新增了WrongNestedHierarchyViolation
,用于检测子 fragment 嵌套在其父项的视图层次结构中,但未添加到父项的childFragmentManager
中的情况。- 采用
Intent
或IntentSender
的Fragment
和FragmentManager
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-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
注解,这意味着,如果未从主线程调用这些 API,它们现在都会抛出构建错误,而不是等到运行时失败。(Ic9665、b/236538905)
bug 修复
- 修复了
FragmentManager
中的一个 bug,该 bug 会导致在同一帧中保存和恢复时发生崩溃。(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
开始:修复了以下问题:如果Lifecycle
已处于STARTED
状态且结果已可用,则无法在setFragmentResultListener
内调用clearFragmentResultListener
。(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 中包含这些提交内容。
行为变更
- 现在,系统会在 fragment 开始转为其目标状态之前对
FragmentManager
的onBackStackChangedListener
执行新的onBackStackChangedStarted
回调。(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
正确进行注解,以避免传入 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
中的情况。(I72521、b/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-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 始终获得正确的回调。(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
的问题。(2Ib1c07、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)
- 修复了以下问题:如果
Lifecycle
已为STARTED
且结果已可用,则无法在setFragmentResultListener
中调用clearFragmentResultListener
。(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 修复
- 修复了以下错误:将自定义
FragmentController
与未实现提供程序回调接口(OnConfigurationChangedProvider
、OnMultiWindowModeChangedProvider
、OnTrimMemoryProvider
、OnPictureInPictureModeChangedProvider
)的主机一起使用,并且调用其已废弃的调度函数时,无法调度到子 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
现在可通过将allowViolation()
与类名称结合使用,使不公开的第三方 fragment 绕过特定的违规处罚。- 用于为 activity 的
ActionBar
提供菜单的 fragment API 已废弃。Activity1.4.0
中添加的MenuHost
和MenuProvider
API 提供了一个可测试的生命周期感知型等效 API Surface,fragment 应使用这些 API。
版本 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 已废弃,因为这些 API 会将 fragment 与 activity 紧密耦合,而且无法单独测试。Activity1.4.0-alpha01
中添加的MenuHost
和MenuProvider
API 提供了一个可测试的生命周期感知型等效 API Surface,Fragment 应使用这些 API。(I50a59、I20758)
bug 修复
SavedStateViewFactory
现在支持使用CreationExtras
,即使其通过SavedStateRegistryOwner
进行初始化也不受影响。如果提供 extra,则会忽略初始化的参数。(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
现在与 ViewModel CreationExtras 集成,后者是作为 Lifecycle2.5.0-alpha01
的一部分推出的。(I3060b、b/207012585)
bug 修复
- 从 Fragment
1.4.1
开始:当通过 xml 生成的 view ID 具有负值时,FragmentContainerView
不会再抛出非法状态异常。(Ic185b、b/213086140) - 从 Fragment
1.4.1
开始:将自定义ownerProducer
lambda 与by viewModels()
延迟函数结合使用时,如果未提供自定义ViewModelProvider.Factory
,该 lambda 现在会使用来自该所有者的defaultViewModelProviderFactory
,而不是始终使用该 fragment 的工厂。(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 生成的 view ID 具有负值时,
FragmentContainerView
不会再抛出非法状态异常。(Ic185b、b/213086140) - 将自定义
ownerProducer
lambda 与by viewModels()
延迟函数结合使用时,如果未提供自定义ViewModelProvider.Factory
,该 lambda 现在会使用来自该所有者的defaultViewModelProviderFactory
,而不是始终使用该 fragment 的工厂。(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。检测到违规情况时,您可以选择输出日志消息,触发您的自定义监听器,或让应用崩溃。通过新方法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-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 转向具有 Recycler 视图的 fragment 后,键盘现在将自动关闭。(I8b842、b/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-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 Lifecycle 的用法更正为 Fragment 视图 Lifecycle。(aosp/1830457、b/200326272)
文档更新
- 现在,由 Activity Result API(即
startActivityForResult
、startIntentSenderForResult
、onActivityResult
、requestPermissions
和onRequestPermissionsResult
)处理的 API 的废弃消息均已扩展,并提供了更多详情。(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 变更
- 用 Kotlin 重写了
FragmentContainerView
类,以确保getFragment
函数正确遵循是否可为 null 性规则。(If694a、b/189629145) - FragmentStrictMode 现已采用 Kotlin 编写(I11767、b/199183506)
bug 修复
- 修复了以下问题:如果某个 fragment 是在执行待处理事务之前通过
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) - 在专门通过
show(FragmentTransaction, String)
方法添加 DialogFragment 且保存状态后,如果您调用DialogFragment
的dismissAllowingStateLoss()
方法,该方法不会再崩溃。(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 修复
- 修复了以下问题:在运行使用
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-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
中引入的共享元素转换回归问题。无论是通过transitionGroup="true"
直接设置的还是通过transitionName
或background
间接设置的转换组,fragment 现在都可以正确处理,并且共享元素不会再抛出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)
行为变更
- 现在,尝试以编程方式或通过 XML 更改
fitsSystemWindow
属性时,FragmentContainerView
会抛出异常。边衬区应该由各个 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。它采用的逻辑与findFragmentById()
方法通过FragmentContainerView
的 ID 返回 fragment 相同,但允许将调用链在一起。(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()
始终包含边界值。- 如果在返回堆栈中找不到指定名称或是提供了 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、#150、b/143774122)
detectFragmentReuse()
会检测之前移除的Fragment
实例是否正在重新添加到FragmentManager
中。在销毁Fragment
实例并将其从FragmentManager
中移除后,不得与其进行交互或保留其引用。(#142、b/153738653)detectFragmentTagUsage()
可检测您是否在布局 XML 中使用<fragment>
标记。将 fragment 膨胀为布局的一部分时应始终使用FragmentContainerView
。(#141、b/153738235)detectWrongFragmentContainer()
检测您是否向不是FragmentContainerView
的容器添加了 fragment。在布局中应始终使用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 检查
- 现在,在
DialogFragment
中使用LayoutInflater.from(Context)
时,UseGetLayoutInflater
Lint 检查会发出警告。您应始终使用对话框 fragment 的getLayoutInflater()
方法获取适用于LayoutInflater
的回调。(#156、b/170781346) - 在
DialogFragment
的onCreateDialog()
方法中调用setOnCancelListener
或setOnDismissListener
时,DialogFragmentCallbacksDetector
lint 检查现在会发出警告。这些监听器由DialogFragment
本身所有,您应替换onCancel()
和onDismiss()
来接收这些回调。(#171、b/181780047、b/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 视图的默认工厂。(I5cbfa、b/186097368) - 从 Fragment 1.3.4 开始:在 API 29 上使用
FragmentContainerView
时,边衬区将不再无限调度,从而修复BottomNavigationBar
和FloatingActionButton
实例的问题。(I1bb78、b/186012452) - 从 Fragment 1.3.4 开始:您现在可以在进程终止后从 fragment 结果软件包中检索 Parcelable。(I65932、b/187443158)
- 从 Fragment 1.3.4 开始:在 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
中引入的共享元素转换回归问题。无论是通过transitionGroup="true"
直接设置的还是通过transitionName
或background
间接设置的转换组,fragment 现在都可以正确处理,并且共享元素不会再抛出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
引入的如下回归问题:在 fragment 中将ViewTreeViewModelStoreOwner.get()
API 与ViewModelProvider
或 Jetpack Compose 方法viewModel()
(使用 Hilt 时)搭配使用时出现的问题。如果与 fragment 提供的ViewModelProvider.Factory
会替换getDefaultViewModelProviderFactory()
,则这些用例现在会正确使用前者(正如通过@AndroidEntryPoint
注解的 Fragment 的作用)。如果您不替换该方法,则系统会创建SavedStateViewModelFactory
,作为保存和恢复其状态以及 fragment 视图的默认工厂。(I5cbfa、b/186097368) - 在 API 29 上使用
FragmentContainerView
时,边衬区将不再无限调度,从而修复BottomNavigationBar
和FloatingActionButton
实例的问题。(I1bb78、b/186012452) - 您现在可以在进程终止后从 fragment 结果软件包中检索 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
现在可以与通过将ViewTreeSavedStateRegistryOwner.get()
与 Fragment 的视图结合使用后返回的SavedStateRegistryOwner
一起使用。(I21acf、b/181577191)
bug 修复
- 修复了 Fragment
1.3.2
引入的如下回归问题:在弹出包含setPrimaryNavFragment
操作(如NavHostFragment
所用的操作)的FragmentTransaction
时会导致popEnter
动画不运行。(I38c87、b/183877426) FragmentContainerView
现在可以确保为每个Fragment
分派一组新的WindowInsets
,从而确保每个 fragment 现在都可以独立使用边衬区。(I63f68、b/172153900)DialogFragment
现在可正确处理将子级 fragment 添加到与自定义Dialog
类中的容器具有相同 ID 的容器的情况,从而修复了在重复使用BottomSheetDialog
等对话框所用 ID 时出现的视图层次结构问题。(Ie6279、b/180021387)FragmentManager.dump()
现在可以正确缩进活跃 fragment 列表中的第一个 fragment。(If5c33、b/183705451)
新状态管理器 bug 修复
- 新的 fragment 状态管理器现在可以使用 hide 操作正确处理退出过渡。(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 中包含这些提交内容。
新状态管理器 bug 修复
- 现在,同时运行
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
中的 Dialog 现在可以通过其 DecorateView 访问 ViewTree 所有者,从而确保ComposeView
可与DialogFragment
一起使用。(Ib9290、b/180691023)
bug 修复
- 现在,当配置更改后,使用 FragmentContainerView 膨胀到状态已变为
RESUMED
的 activity 的 fragment 可以正确显示。(Ie14c8、b/180538371) - fragment
toString()
的结尾不再包含多余的}
(I54705、b/177761088) - FragmentActivity 中被替换的方法现在可以正确继承基础方法 javaDoc(I736ce 和 b/139548782)
setFragmentResult
和setFragmentResultListener
的相关文档更新了其参数说明,以反映它们不再接受可为 null 值 (I990ba、b/178348386)
新状态管理器 bug 修复
- 修复了 fragment 中由
mFocusedView
引起的内存泄漏问题(Ib4e9e、b/179925887) - 现在,fragment 在使用 show/hide 事务时可以正确调用
onCreateOptionsMenu
(I8bce8、b/180255554) - 如果子 fragment 包含有在正在布局的 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 的支持,让您无需替换 fragment 中的方法,即可处理startActivityForResult()
+onActivityResult()
以及requestPermissions()
+onRequestPermissionsResult()
流程,此外还提供了用于测试这些流程的钩子。请参阅更新后的获取 Activity 的结果一文。- 此版本修复了以下方面的一些问题:无效请求代码,以及会阻止 Activity Result API 处理先前
FragmentActivity
版本的权限请求的调度。您必须升级到 Fragment 1.3.0,才能在FragmentActivity
或AppCompatActivity
中使用 Activity Result API。
- 此版本修复了以下方面的一些问题:无效请求代码,以及会阻止 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
工件中的FragmentScenario
类已使用 Kotlin 重写,并进行了一些改进:FragmentScenario
现在使用setMaxLifecycle()
来实现moveToState()
,从而确保在所有 API 级别中实现一致的行为,并将 Fragment 的状态与底层 Activity 分离。- 现在,
FragmentScenario
支持设置初始Lifecycle.State
,以支持在首次移至每个Lifecycle.State
之前断言 Fragment 的状态。 - 现在,您可以使用具体化的 Kotlin 扩展方法
withFragment
(允许您返回值)的形式来替代onFragment
的FragmentScenario
API。值得注意的是,这会重新抛出指定代码块中发生的异常。
ViewTree
支持:Fragment
现在支持在 Lifecycle2.3.0
和 SavedState1.1.0
中添加的ViewTreeLifecycleOwner.get(View)
、ViewTreeViewModelStoreOwner.get(View)
和ViewTreeSavedStateRegistryOwner
API,以便在使用Fragment
中的View
时将相应 fragment 返回为ViewModelStoreOwner
,以及与相应 fragment 的视图 Lifecycle 关联的SavedStateRegistryOwner
和LifecycleOwner
。TRANSIT_
动画更改:Fragment 的默认效果TRANSIT_FRAGMENT_OPEN
、TRANSIT_FRAGMENT_CLOSE
和TRANSIT_FRAGMENT_FADE
现在使用Animator
而不是Animation
。用于构建这些 Animator 的资源现在是不公开的。setRetainInstance()
弃用:已弃用 Fragment 上的setRetainInstance()
方法。引入 ViewModel 后,开发者可以使用特定 API 保留与 Activity、Fragment 以及 Navigation 图相关联的状态。如此一来,开发者便可以使用正常(而非保留)的 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)
新状态管理器 bug 修复
- Fragment 的视图
Lifecycle
现在可以正确处理 Fragment 视图在Lifecycle
达到CREATED
状态之前被销毁的情况,从而避免返回“no event down from INITIALIZED”的异常。(eda2bd、b/176138645) - 使用
FragmentContainerView
时,使用Animator
的 Fragment 现在以正确顺序显示。(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()
相同的逻辑,并且当父级 Fragment 调用setMenuVisibility(false)
时,系统不再对其进行调用。(Id7de8、b/173203654)
新状态管理器 bug 修复
- 修复了在向
FragmentContainerView
添加具有Animation
的 Fragment,然后利用弹出操作中断相应添加时出现泄漏和视觉痕迹的问题。(I952d8) - 修复了如下问题:fragment 的视图在其
onCreate()
或onViewCreated()
方法中被替换后仍保留在视图层次结构中。(I8a7d5) - 现在,当 Fragment 根视图恢复时,相应根视图会正确恢复获得焦点的状态。(Ifc84b)
- 现在,在同一 Fragment 事务中结合使用弹出和替换操作时,系统会显示适当的动画(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
属性膨胀 Fragment 的 FragmentContainerViews 现在可以在FragmentActivity
之外使用。(Id4397、b/172266337) - 现在,如果尝试将 Fragment 的最大生命周期设为
DESTROYED
,则会抛出IllegalArgumentException
(Ie7651、b/170765622) - 现在,如果初始化处于
DESTROYED
状态的 FragmentScenario,则会抛出IllegalArgumentException
(I73590、b/170765622)
新状态管理器 bug 修复
- 修复了如下问题:当某个 fragment 转换中用到
Animator
或其中一个TRANSIT_FRAGMENT_
选项时,如果您中断该转换,视图就会无法达到其最终状态。(I92426、b/169874632) - 修复了导致具有退出
Animation
的 fragment 无法正确销毁的问题。(I83d65) - 现在,已将其效果反转的退出 Fragment 可以正确取消,并且能够以适当的进入效果重启。(I62226、b/167092035)
- 修复了
hide()
的退出Animator
无法运行的问题。(Id7ffe) - 现在,Fragment 在推迟并立即启动后会正确显示。(Ie713b、b/170022857)
- 如果 Fragment 在某动画呈现期间移除了自己的聚焦视图,那么这些 Fragment 在达到
RESUMED
状态后将不再尝试在已分离的视图上恢复焦点(I38c65、b/172925703)
外部贡献
- 现在,
FragmentFactory
为不同的ClassLoader
实例单独缓存 Fragment 类。感谢 Simon Schiller!(#87、b/113886460)
版本 1.3.0-beta01
2020 年 10 月 1 日
发布了 androidx.fragment:fragment:1.3.0-beta01
、androidx.fragment:fragment-ktx:1.3.0-beta01
和 androidx.fragment:fragment-testing:1.3.0-beta01
。版本 1.3.0-beta01 中包含这些提交内容。
新功能
setMaxLifecycle()
现在支持将Lifecycle
状态设置为INITIALIZING
,前提是 Fragment 尚未移至CREATED
。(b/159662173)
API 变更
- 升级 androidx 以使用 Kotlin 1.4(Id6471、b/165307851、b/165300826)
行为变更
- Fragment 资源文件已正确设为不公开。(aosp/1425237)
bug 修复
- 使用
<fragment>
标记膨胀的 Fragment 现在会正常等待其视图添加到容器中,然后其状态才会变为 STARTED (I02f4c) - 目前可见、之后通过
setMaxLifecycle()
将状态变为CREATED
的 Fragment 现在会正确运行其退出效果。(b/165822335) - 移除未添加至返回堆栈的已分离 Fragment 不会再导致内存泄漏。由 Nicklas Ansman Giertz 提供解决方法!(b/166489383)
- 有效的 Fragment 现在始终具有非 null
FragmentManager
,并且具有非 nullFragmentManager
的 Fragment 将始终被视为有效。(aosp/1422346) - Fragment 的默认效果
TRANSIT_FRAGMENT_OPEN
、TRANSIT_FRAGMENT_CLOSE
和TRANSIT_FRAGMENT_FADE
现在使用Animator
(而不是Animation
)。(b/166155034)
新状态管理器 bug 修复
- Fragment 现在可以在启动动画之前正确恢复其视图焦点状态。(Icc256)
- 现在,仅具有共享元素过渡的 Fragment 会正确完成其特殊效果,这意味着它们实际上会转为其最终状态(Iaebc7、b/166658128)
- 现在,Fragment 视图始终会先从容器中移除,然后再销毁。(Id5876)
- 新的状态管理器现在始终会先移除现有的 Fragment 视图,然后再添加进场 Fragment 视图。(I41a6e)
- 新的状态管理器现在会遵从对 Fragment 视图可见性的明确更改。这意味着,如果您在动画开始播放前将进场 Fragment 视图设置为
INVISIBLE
,该视图实际上会保持不可见状态。(b/164481490) - Fragment 现在会将
Animators
的优先级设置为高于Animations
,也就是说,同时具有这两者的 Fragment 将仅运行Animator
而忽略Animation
。(b/167579557) - 在使用进场动画时,新状态管理器不会再导致 Fragment 闪烁。(b/163084315)
已知问题
在使用新状态管理器时,如果您在进场特殊效果运行期间按返回按钮,而不是返回上一个 Fragment,那么旧 Fragment 绝不会重新添加,从而导致出现空白屏幕。(b/167259187、b/167092035、b/168442830)
版本 1.3.0-alpha08
2020 年 8 月 19 日
发布了 androidx.fragment:fragment:1.3.0-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
操作的上一个 Fragment 现在可在新 Fragment 启动之前正确停止。(b/161654580)- 现在,Fragment 可防止相同的 Fragment 上存在多个竞争动画,从而避免发生
Animation
会替换所有Transition
效果或单个 Fragment 上的Animator
和Transition
会同时运行的情况。(b/149569323) - 现在,系统会运行所有进场和退出 Fragment 的
enterTransition
和exitTranstion
,而不是仅运行最后一个进场 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
和 AndroidXTransition
实例时出现的错误消息现在会提及包含无效过渡的 Fragment。(b/155574969)
行为变更
- 您现在可以对 Fragment 的
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()
之前直接设置 Fragment 的根视图的可见性会导致您设置的可见性被FragmentManager
(控制着根视图的可见性)覆盖。为了解决此问题,您应始终使用hide()
和show()
操作来更改 Fragment 的可见性。(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
的初始生命周期状态,而不是始终将 Fragment 转为RESUMED
状态。(b/159662750)- 以具体化的 Kotlin 扩展方法
withFragment
(允许您返回值)的形式,为onFragment
的FragmentScenario
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-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 修复
- 现在,父级 Fragment 会在其子级 Fragment 之前恢复视图状态,从而修复了在配置更改后,当
DialogFragment
将其他DialogFragment
显示为子级 Fragment 时发生的视觉排序问题。(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 中包含这些提交内容。
新功能
- 在
Fragment
中使用View
时,添加了对来自 Lifecycle2.3.0-alpha03
的ViewTreeViewModelStoreOwner
的支持,以及对来自 SavedState1.1.0-alpha01
的ViewTreeSavedStateRegistryOwner
的支持。(aosp/1297993 和 aosp/1300264)
API 变更
setFragmentResult()
和setFragmentResultListener()
API 现在分别接受非 nullBundle
和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 在两个 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) - 修复了在向具有
FragmentContainerView
的DialogFragment
视图层次结构添加 Fragment 时出现的illegalStateException
。(b/154366601) - 在 Activity 之外托管 Fragment 时,用于 Fragment 的
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 变更
Fragment
上的prepareCall
方法现为final
。(b/152439361)
bug 修复
- 修复了在使用
BottomSheetDialogFragment
时在 Fragment1.3.0-alpha02
中引入的回归问题。(b/151652127、aosp/1263328、aosp/1265163) - 修复了更改配置后在 Fragment 中使用
prepareCall
时发生的崩溃问题。(b/152137004) - 修复了使用
setTargetFragment()
时共享元素和退出过渡被忽略的问题。(b/152023196) - 从 Fragment
1.2.4
开始:更新了 Fragment ProGuard 规则,允许混淆处理保留的 Fragment。(b/151605338) - 从 Fragment
1.2.4
开始:对DialogFragment
类停用了FragmentLiveDataObserve
Lint 规则,因为它们的 Lifecycle 和视图 Lifecycle 始终保持同步,因此可以在调用observe
时放心使用this
或viewLifecycleOwner
。(b/151765086)
依赖项变更
- Fragment 依赖于 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 的支持,让您无需覆盖 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/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 的支持,以便在onCreateView()
返回任意视图的LifecycleOwner
时,返回 Fragment 的viewLifecycleOwner
。(aosp/1182955)
API 变更
- 已弃用 Fragment 上的
setRetainInstance()
方法。引入 ViewModel 后,开发者可以使用特定 API 保留与 Activity、Fragment 以及 Navigation 图相关联的状态。如此一来,开发者便可以使用正常(而非保留)的 fragment,并能够区分他们想保留的特定状态,避免常见的泄露源,同时保留与保留状态的某项创建和销毁(即,ViewModel
的构造函数和它收到的onCleared()
回调)操作相关的有用属性。(b/143911815) - ViewPager2
1.0.0
发布后,用于与ViewPager
进行交互的FragmentPagerAdapter
和FragmentStatePagerAdapter
类已弃用。请参阅从 ViewPager 迁移到 ViewPager2。(b/145132715)
bug 修复
- 现在,Fragment ProGuard 规则只会正确保留使用的默认构造函数
Fragment
类,而非所有Fragment
实例的类,从而修复了在 Fragment1.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.5
、androidx.fragment:fragment-ktx:1.2.5
和 androidx.fragment:fragment-testing:1.2.5
。版本 1.2.5 中包含这些提交内容。
bug 修复
- Fragment 的
getViewLifecycleOwner()
现在会在调用onSaveInstanceState()
之前停止,从而镜像 Fragment 生命周期的行为。此修复之前已在 Fragment1.3.0-alpha04
中发布。(b/154645875) - 对某个 Fragment 调用
setMenuVisibility(false)
现在会正确更改其子级 Fragment 提供的菜单的可见性。此修复之前已在 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 修复
- 更新了 Fragment ProGuard 规则,允许混淆处理保留的 Fragment。(b/151605338)
- 对
DialogFragment
类停用了FragmentLiveDataObserve
Lint 规则,因为它们的 Lifecycle 和视图 Lifecycle 始终保持同步,因此可以在调用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
中的 bug,即从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 建议将
viewLifecycleOwner
用作LifecycleOwner
,以调用onCreateView()
、onViewCreated()
和onActivityCreated()
中的OnBackPressedDispatcher
。(b/142117657) - 添加了新的 Lint 检查,用于确认您在使用
fragment-testing
工件时是否使用了正确的debugImplementation
。(b/141500106) - 现在,Fragment 建议使用关联的
require___()
方法处理更多描述性错误消息,而不是对同时包含get
和require
等效方法的所有 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.1
、androidx.fragment:fragment-ktx:1.2.1
和 androidx.fragment:fragment-testing:1.2.1
。版本 1.2.1 中包含这些提交内容。
bug 修复
- 现在,ProGuard 会保留通过可获取
Class
实例(或 Kotlin 具体化版本)的add
和replace
方法添加的 Fragment 的默认构造函数。(b/148181315) - 在运行
finishUpdate()
时,FragmentStatePagerAdapter
和FragmentPagerAdapter
不再捕获FragmentManager
抛出的异常。(aosp/1208711) - 修复了
FragmentManager.findFragment()
无法与通过<fragment>
标记添加的 Fragment 一起使用的问题。(b/147784323) - 现在,当在布局中时,使用
<fragment>
标记膨胀的 Fragment 始终会在onCreate()
之前收到对onInflate()
的调用。(aosp/1215856) - 当 Activity 被销毁后,在
FragmentManager
实例上调用toString()
不再抛出NullPointerException
。(b/148189412)
依赖项变更
- Fragment
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
容器来存储动态添加的 Fragment,而不要使用FrameLayout
或其他布局。FragmentContainerView 同样支持class
、android:name
和可选的android:tag
(这与<fragment>
标记相同),但会使用常规的FragmentTransaction
来添加此初始 Fragment,而不会添加<fragment>
使用的自定义代码路径。 onDestroyView()
调用时机:Fragment 现在会等到退出动画、退出框架转换和退出 AndroidX 转换(使用 Transition1.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 的非 nullFragmentManager
(您可以使用isAdded()
来确定是否可以安全调用该方法)。 - 弃用
FragmentManager.enableDebugLogging()
:弃用了静态FragmentManager.enableDebugLogging
方法。FragmentManager 现在遵循FragmentManager
标记的Log.isLoggable()
,以允许您启用DEBUG
或VERBOSE
日志记录,而无需重新编译应用。
已知问题
- ProGuard 不会自动保留仅通过
FragmentContainerView
上的class
或android:name
属性引用的 Fragment,需要您为每个 Fragment 类手动添加保留规则。(b/142601969) - 通过
FragmentContainerView
使用class
或android:name
在 XML 文件中添加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 中包含以下提交内容。
bug 修复
- 修复了使用
<fragment>
标记时 Fragment1.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-rc04
、androidx.fragment:fragment-ktx:1.2.0-rc04
和 androidx.fragment:fragment-testing:1.2.0-rc04
。版本 1.2.0-rc04 中包含以下提交内容。
bug 修复
- 调整了
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 中包含以下提交内容。
bug 修复
- 修复了以下意外行为变更:当已被移除的 Fragment 的退出动画/转换运行时,
findFragmentById()
/findFragmentByTag()
仍会返回这些 Fragment。(b/143982969、aosp/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 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 中包含这些提交内容。
bug 修复
- 在 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 中包含这些提交内容。
新功能
- 现在除了
android:name
之外,FragmentContainerView
还支持class
属性,体现了<fragment>
标记的功能。(b/142722242) - 添加了新的 Lint 检查,以确保您从
onCreateView()
、onViewCreated()
或onActivityCreated()
中观察LiveData
时使用getViewLifecycleOwner()
。(b/137122478)
bug 修复
- 现在对
DialogFragment
的onDismiss
和onCancel
回调可确保传递给它们的DialogInterface
为非 null 值,并且getDialog()
在执行时返回非 null 值。(b/141974033) FragmentContainerView
在膨胀过程中现在会添加由class
或android:name
指定的 Fragment,以确保findFragmentById()
和findFragmentByTag()
之后立即生效。(b/142520327)- 修复了由于保存状态而导致的
FragmentContainerView
中的IllegalStateException
。(b/142580713) - 修复了混淆
FragmentContainerView
类时导致的FragmentContainerView
中的UnsupportedOperationException
。(b/142657034)
已知问题
- ProGuard 不会自动保留仅通过
FragmentContainerView
上的class
或android:name
属性引用的 Fragment,需要您为每个 Fragment 类手动添加保留规则。我们已停用建议移至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 中包含这些提交内容。
bug 修复
- 修复了 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
新增了对添加初始 Fragment 的支持,并新增了对android:name
和可选android:tag
XML 属性的支持。与<fragment>
标记不同,FragmentContainerView
在后台使用常规FragmentTransaction
来添加初始 Fragment,允许对FragmentContainerView
执行进一步的FragmentTransaction
操作,并允许对布局使用视图绑定。(b/139830628、b/141177981)- Fragment 现在包含 Lint 警告,提供了将
<fragment>
替换为FragmentContainerView
的快速修复。(b/139830056)
bug 修复
- 修复了使用
androidx.transition
时出现的ClassCastException
。(b/140680619) - 使用 Transition
1.3.0-beta01
时,Fragment 现在会等待androidx.transition
转换(还有框架转换和动画,它们分别在 Fragment1.2.0-alpha03
和 Fragment1.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 Test1.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-alpha04
、androidx.fragment-ktx:example:1.2.0-alpha04
和 androidx.fragment:fragment-testing:1.2.0-alpha04
。版本 1.2.0-alpha04 中包含这些提交内容。
API 变更
Fragment
上的getFragmentManager()
和requireFragmentManager()
方法已弃用,并替换为单个getParentFragmentManager()
方法,后者会返回添加了 Fragment 的非 nullFragmentManager
(您可以使用isAdded()
确定是否可以安全调用)。(b/140574496)- 已弃用静态
FragmentManager.enableDebugLogging
方法。FragmentManager 现在遵守标记FragmentManager
的Log.isLoggable()
,允许您启用DEBUG
或VERBOSE
日志记录,而无需重新编译应用。(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-alpha03
、androidx.fragment:fragment-ktx:1.2.0-alpha03
和 androidx.fragment:fragment-testing:1.2.0-alpha03
。点击此处可查看此版本中包含的提交内容。
API 变更
FragmentContainerView
现为final
。(b/140133091)
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-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)- 更新了将
TRANSIT_FRAGMENT_OPEN
、TRANSIT_FRAGMENT_CLOSE
、TRANSIT_FRAGMENT_FADE
与FragmentTransaction
上的setTransition
一起使用时的默认动画,以匹配 Android 10 设备上的 Activity 使用的动画。(aosp/1012812、aosp/1014730)
API 变更
- 引入了
FragmentContainerView
作为用于容纳动态添加的 fragment 的容器(强烈推荐),可替代使用FrameLayout
等,因为它解决了动画 z 排序问题以及分派给 fragment 的窗口边衬区的问题。(b/37036000、aosp/985243、b/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)- 已弃用
FragmentTransaction
和FragmentManager.BackStackEntry
上的面包屑导航标题相关 API。(b/138252944) - 已弃用
FragmentTransaction
上的setTransitionStyle
方法。(aosp/1011537) FragmentManager
中的许多方法已不再是abstract
。FragmentManager
本身仍然是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
开始:修复了移除当前项时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)
bug 修复
- 修复了在
replace()
之前弹出使用过setPrimaryNavigationFragment()
的FragmentTransaction
时出现的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:您现在可以在
FragmentManager
上设置一个FragmentFactory
,以管理 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
。点击此处可查看此版本中包含的提交内容。
bug 修复
- 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
。点击此处可查看此版本中包含的提交内容。
bug 修复
- 修复了多次调用设有超时的
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
。点击此处可查看此版本中包含的提交内容。
bug 修复
- 修复了移除当前项时
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
。点击此处可查看此版本中包含的提交内容。
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-beta01
、androidx.fragment:fragment-ktx:1.1.0-beta01
和 androidx.fragment:fragment-testing:1.1.0-beta01
。点击此处可查看此版本中包含的提交内容。
bug 修复
- 适用于嵌套 Fragment 的
androidx.lifecycle.Lifecycle
回调(具体而言是与STARTED
、RESUMED
、PAUSED
、STOPPED
和DESTROYED
相关的回调)现在已正确嵌套。(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-alpha09
、androidx.fragment:fragment-ktx:1.1.0-alpha09
和 androidx.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-alpha08
、androidx.fragment:fragment-ktx:1.1.0-alpha08
和 androidx.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 变更
- 重大变更:移除了先前已弃用的需要
Bundle
的FragmentFactory
instantiate
方法。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
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-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) 的影响,在托管 activity 重新创建后,返回堆栈上的 fragment 将不会获得对
onCreateView()
的回调。onCreateView()
现在仅在 fragment 变得可见时(即返回堆栈被弹出)才会被调用。
bug 修复
- 修复了在 XML 中使用
<fragment>
标记以及使用FragmentActivity
或AppCompatActivity
的contentLayoutId
构造函数时出现的问题。(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-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 的采用参数 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-alpha05
、androidx.fragment:fragment-ktx:1.1.0-alpha05
和 androidx.fragment:fragment-testing:1.1.0-alpha05
。点击此处可查看此版本中包含的完整提交内容列表。
新功能
@ContentView
注解查询现已缓存 (b/123709449)
行为变更
- 现在,如果使用连接到不同 FragmentManager 的 Fragment 来调用
remove()
、hide()
、show()
、detach()
和setPrimaryNavigationFragment()
,则会抛出IllegalStateException
,而不是在无提示的情况下失败 (aosp/904301)
bug 修复
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)
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
。