Fragment
最近更新时间 | 当前稳定版 | 下一候选版本 | Beta 版 | Alpha 版 |
---|---|---|---|---|
2021 年 2 月 10 日 | 1.3.0 | - | - | - |
声明依赖项
如需添加 Fragment 的依赖项,您必须将 Google Maven 代码库添加到项目中。如需了解详情,请参阅 Google 的 Maven 代码库。
在应用或模块的 build.gradle
文件中添加所需工件的依赖项:
dependencies { def fragment_version = "1.2.5" // Java language implementation implementation "androidx.fragment:fragment:$fragment_version" // Kotlin implementation "androidx.fragment:fragment-ktx:$fragment_version" // Testing Fragments in Isolation debugImplementation "androidx.fragment:fragment-testing:$fragment_version" }
如需详细了解依赖项,请参阅添加构建依赖项。
反馈
您的反馈将帮助我们改进 Jetpack。如果您发现了新问题,或对库的改进有某些建议,请告诉我们。创建新问题前,请先查看此库中的现有问题。您可以点击星标按钮,为现有问题投票。
如需了解详情,请参阅问题跟踪器文档。
版本 1.3.0
版本 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 中包含这些提交内容。
问题修复
- 修复了配置更改后,父级
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
的 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 中包含这些提交内容。
问题修复
- 现在,
onPrepareOptionsMenu()
遵循与onCreateOptionsMenu()
相同的逻辑,并且当父级 Fragment 调用setMenuVisibility(false)
时,系统不再对其进行调用。(Id7de8、b/173203654)
新状态管理器问题修复
- 修复了在向
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)
新状态管理器问题修复
- 修复了如下问题:当某个 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)
问题修复
- 使用
<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)
新状态管理器问题修复
- 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)
问题修复
- 现在会正确处理使用
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)
问题修复
- 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)
问题修复
- 现在,父级 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。请使用 ActivityResult API。(aosp/1290887) - Activity
1.2.0-alpha04
中的重大变更:prepareCall()
方法已重命名为registerForActivityResult()
。(aosp/1278717)
问题修复
- 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)
问题修复
- 修复了在使用
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)
问题修复
- 从 Fragment
1.2.3
开始:修复了从onCreateDialog()
内调用getLayoutInflater()
时,DialogFragment
中导致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)
问题修复
- 现在,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 中包含这些提交内容。
问题修复
- 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 中包含这些提交内容。
问题修复
- 更新了 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 中包含这些提交内容。
问题修复
- 修复了从
onCreateDialog()
内调用getLayoutInflater()
时,DialogFragment
中导致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)
问题修复
- 修复了 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 中包含这些提交内容。
问题修复
- 现在,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 中包含以下提交内容。
问题修复
- 修复了使用
<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 中包含以下提交内容。
问题修复
- 调整了
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 中包含以下提交内容。
问题修复
- 修复了以下意外行为变更:当已被移除的 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 中包含这些提交内容。
问题修复
- 在 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)
问题修复
- 现在对
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 中包含这些提交内容。
问题修复
- 修复了 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)
问题修复
- 修复了使用
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)
问题修复
- 现在,当一些 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)
问题修复
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()
等中获取现有实例。
问题修复
- 从 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)
问题修复
- 修复了在
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 属性委托:用于访问与单个 Fragment 相关联的 ViewModel 的by viewModels()
,以及用于访问范围限定为 Activity 的 ViewModel 的by activityViewModels()
。 - 最大生命周期:您现在可以通过对
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) - 修复了在
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
。点击此处可查看此版本中包含的提交内容。
问题修复
- 适用于嵌套 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
问题修复
- 由子级 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
问题修复
- 通过
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 变得可见时(即返回堆栈被弹出)才会被调用。
问题修复
- 修复了在 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)
问题修复
- 修复了 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)
问题修复
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) - 修复了调用
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]
问题修复
- 修复了“保存状态失败”这一 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
工件和基于 androidx.test:core API 构建的 FragmentScenario
的第一个版本。如需了解更多详情,请参阅 Fragment 测试文档。
新功能
- 新增了用于单独测试 Fragment 的 FragmentScenario 类。
- 您现在可以在任何
FragmentManager
上设置FragmentFactory
,以控制新 Fragment 实例的实例化方式。 - 添加了新的
by viewModels()
Kotlin 属性委托,用于从 Fragment 检索 ViewModel。 - 现在,Fragment 的
onStop()
中取消了待处理输入事件(例如点击)。
API 变更
- 大幅扩展了 Fragment API 接口的可为 null 性注解。
问题修复
- 修复了导致 Fragment 操作在 LiveData 内部失败的问题 (b/77944637)
已知问题
- 从 FragmentManager 移除某个 Fragment 之后,就无法访问目标 Fragment。
fragment-testing
依赖于androidx.test:core:1.0.0-beta01
,而不是正确的androidx.test:core:1.0.0
。