片段
最新更新 | 穩定版本 | 發布候選版本 | Beta 版本 | Alpha 版本 |
---|---|---|---|---|
2024 年 9 月 4 日 | 1.8.3 | - | - | - |
聲明依賴項
要添加對 Fragment 的依賴項,您必須將 Google Maven 倉庫添加到您的項目中。閱讀 Google 的 Maven 倉庫 以獲取更多信息。
在應用程序或模塊的 build.gradle
文件中添加您需要的工件的依賴項
Groovy
dependencies { def fragment_version = "1.8.3" // 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.3" // Java language implementation implementation("androidx.fragment:fragment:$fragment_version") // Kotlin implementation("androidx.fragment:fragment-ktx:$fragment_version") // Compose implementation("androidx.fragment:fragment-compose:$fragment_version") // Testing Fragments in Isolation debugImplementation("androidx.fragment:fragment-testing:$fragment_version") }
有關依賴項的更多信息,請參閱 添加構建依賴項。
反饋
您的反饋有助於改善 Jetpack。如果您發現新問題或有改進此庫的想法,請告訴我們。在創建新問題之前,請查看此庫中現有問題。您可以通過點擊星形按鈕為現有問題投票。
查看 問題追蹤器文檔 以獲取更多信息。
版本 1.8
版本 1.8.3
2024 年 9 月 4 日
androidx.fragment:fragment-*:1.8.3
已發布。版本 1.8.3 包含 這些提交。
錯誤修復
FragmentManager
現在在處理預測性返回手勢時會正確考慮掛起的操作。這應確保執行系統返回不再導致IndexOutOfBoundsException
。 (I9ba32, b/342316801)AndroidFragment
如果在包含的活動/片段的狀態已保存時添加到組成中,將不再崩潰。 (I985e9, b/356643968)
版本 1.8.2
2024 年 7 月 24 日
androidx.fragment:fragment-*:1.8.2
已發布。版本 1.8.2 包含 這些提交。
錯誤修復
AndroidFragment
現在正確地處理父片段被放置在片段後退堆棧中的情況,避免在返回到該片段時出現“找不到 ID 的視圖”問題。 (I94608)- 通過
FragmentTransaction.add
方法(接受ViewGroup
)添加的片段現在在進展到onStart()
之前等待onContainerAvailable
。這會影響該 API 的使用者,例如AndroidFragment
,它現在會在通過onStart()
移動它之前等待AndroidFragment
重新進入組成。 (I94608)
版本 1.8.1
2024 年 6 月 26 日
androidx.fragment:fragment-*:1.8.1
已发布。版本 1.8.1 包含 这些提交。
錯誤修復
- 修复了在启动预测后退手势时,没有容器的片段立即被
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
,它允许通过片段类名将片段添加到 Compose 层次结构中。它自动处理片段状态的保存和恢复。这应该用作以前推荐的通过AndroidViewBinding
膨胀片段的方法的直接替代。FragmentManager
的OnBackStackChangedListener
接口上的onBackStackChangeCancelled
回调现在作为在FragmentManager
中执行操作的一部分触发,使其更接近onBackStackChangeCommitted
回调的时机。
版本 1.8.0-rc01
2024 年 5 月 29 日
androidx.fragment:fragment-*:1.8.0-rc01
已发布。版本 1.8.0-rc01 包含 这些提交。
錯誤修復
FragmentManager
的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 包含 这些提交。
錯誤修復
- 来自 Fragment
1.7.1
: 预测后退现在只会在所有片段都具有 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 包含 这些提交。
錯誤修復
- 来自 Fragment
1.7.0-rc02
: 添加了日志以指示为什么在没有其他过渡的情况下设置sharedElement
会无法运行。(Iec48e) - 来自 Fragment
1.7.0-rc02
: 修复了一个错误,如果将不可搜索的共享元素添加到所有其他过渡都可搜索的事务中,则会出现崩溃。现在事务将正确地被视为不可搜索。(I18ccd)
版本 1.8.0-alpha01
2024 年 4 月 3 日
androidx.fragment:fragment-*:1.8.0-alpha01
已发布。版本 1.8.0-alpha01 包含 这些提交。
新功能
- 新的
AndroidFragment
Composable
允许通过片段类名将片段添加到 Compose 层次结构中。它自动处理片段状态的保存和恢复。这可以用作 AndroidViewBindingComposable
的直接替代。(b/312895363,Icf841)
文档变更
- 更新了
OnBackStackChangedListener
API 的文档,以指示何时调用它们以及如何使用它们。(I0bfd9)
依赖更新
- Fragment 现在依赖于 Profile Installer 1.3.1。
版本 1.7
版本 1.7.1
2024 年 5 月 14 日
androidx.fragment:fragment-*:1.7.1
已发布。版本 1.7.1 包含 这些提交。
錯誤修復
- 预测后退现在只会在所有片段都具有 Animator 或 Seekable Androidx Transition 的事务中运行。这修复了一个问题,即取消部分可搜索事务会导致空白屏幕。(I43037,b/339169168)
版本 1.7.0
2024 年 5 月 1 日
androidx.fragment:fragment-*:1.7.0
已发布。版本 1.7.0 包含 这些提交。
预测后退手势支持
- 片段现在在使用
Animator
或使用 AndroidX Transition 1.5.0 时提供对预测应用内后退的支持。这允许用户使用后退手势查看上一个片段,方法是在决定通过完成手势提交事务或取消事务之前搜索您的 Animator/Transition。
过渡系统 | XML 资源 | 支持预测后退 |
---|---|---|
动画 |
R.anim |
否 |
Animator |
R.animator |
是 |
框架 Transition |
R.transition |
否 |
具有 Transition 1.4.1 或更低版本的 AndroidX Transition |
R.transition |
否 |
具有 Transition 1.5.0 的 AndroidX Transition |
R.transition |
是 |
如果您在 选择使用预测后退手势 后发现片段中的预测后退支持有任何问题,请 针对 Fragment 提交问题,并提供一个可以重现问题的示例项目。您可以在活动的 onCreate()
中使用 FragmentManager.enabledPredictiveBack(false)
禁用预测后退。
FragmentManager.OnBackStackChangedListener()
现在提供 onBackStackChangeProgressed()
和 onBackStackChangeCancelled()
,分别用于接收预测后退进度和已取消事件。
Fragment Compose 工件
已经创建了一个新的 fragment-compose
工件,专注于支持正在从基于片段的体系结构迁移到完全基于 Compose 的体系结构的应用程序。
此新工件中可用的第一个功能是在 Fragment
上的 content
扩展方法,该方法试图通过为您创建 ComposeView
并设置正确的 ViewCompositionStrategy
来简化使用 Compose 作为单个片段 UI 的过程。
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 包含 这些提交。
錯誤修復
- 添加了日志以指示为什么在没有其他过渡的情况下设置
sharedElement
会无法运行。(Iec48e) - 修复了一个错误,如果将不可搜索的共享元素添加到所有其他过渡都可搜索的事务中,则会出现崩溃。现在事务将正确地被视为不可搜索。(I18ccd)
版本 1.7.0-rc01
2024 年 4 月 3 日
androidx.fragment:fragment-*:1.7.0-rc01
已发布。版本 1.7.0-rc01 包含 这些提交。
依赖更新
- Fragment 现在依赖于 Profile Installer 1.3.1。
版本 1.7.0-beta01
2024 年 3 月 20 日
androidx.fragment:fragment-*:1.7.0-beta01
已发布。版本 1.7.0-beta01 包含 这些提交。
API 变更
FragmentHostCallback
现在使用 Kotlin 编写,以便 Host 的泛型类型的可空性与onGetHost()
的返回值类型匹配。(I40af5)
錯誤修復
- 修复了一个问题,即在对不在容器中的片段提交预测后退手势时,该片段永远不会被销毁。片段现在将立即移动到最终状态。(Ida0d9)
- 修复了片段中的一个问题,即使用预测后退手势中断传入的过渡会导致进入视图被销毁,并留下空白屏幕。(Id3f22,b/319531491)
版本 1.7.0-alpha10
2024 年 2 月 7 日
androidx.fragment:fragment-*:1.7.0-alpha10
已发布。 版本 1.7.0-alpha10 包含这些提交。
錯誤修復
- 修复了之前 Fragment 版本中的已知问题,在使用 Fragment 的预测后退支持
Animator
或 AndroidX Transition 时,如果从未通过addOnBackStackChangedListener
添加过FragmentManager.OnBackStackChangedListener
,则片段会从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
工件,专注于支持正在从基于片段的体系结构迁移到完全基于 Compose 的体系结构的应用程序。
此新工件中可用的第一个功能是在 Fragment
上的 content
扩展方法,该方法试图通过为您创建 ComposeView
并设置正确的 ViewCompositionStrategy
来简化使用 Compose 作为单个片段 UI 的过程。(561cb7,b/258046948)
class ExampleFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
) = content {
// Write your @Composable content here
val viewModel: ExampleViewModel = viewModel()
// or extract it into a separate, testable method
ExampleComposable(viewModel)
}
}
新功能
FragmentManager.OnBackStackChangedListener()
现在提供onBackStackChangeProgressed()
和onBackStackChangeCancelled()
,分别用于接收预测后退进度和已取消事件。(214b87)
已知问题
- 当使用 Fragment 的 Predictive Back 支持用于
Animator
或 AndroidX Transition 时,如果从未通过addOnBackStackChangedListener
添加过FragmentManager.OnBackStackChangedListener
,Fragments 将从handleOnBackProgressed
抛出NullPointerException
。手动添加侦听器将解决崩溃问题。此问题的修复程序将在 Fragments 的下一个版本中提供。
版本 1.7.0-alpha08
2024 年 1 月 10 日
androidx.fragment:fragment-*:1.7.0-alpha08
已发布。 版本 1.7.0-alpha08 包含以下提交。
清理
- 删除了针对 Transition 库的解决方法,该解决方法已在 Transition
1.5.0-alpha06
中修复。 (I04356)
版本 1.7.0-alpha07
2023 年 11 月 29 日
androidx.fragment:fragment-*:1.7.0-alpha07
已发布。 版本 1.7.0-alpha07 包含以下提交。
錯誤修復
- 修复了由设置共享元素过渡并未能同时设置进入/退出过渡导致的
NullPointerException
。 (I8472b) - 来自 Fragment
1.6.2
:当FragmentContainerView
的 Fragment 被填充时,其状态(如FragmentManager
、Host 和 id)现在可以在onInflate
回调中访问。 (I1e44c,b/307427423) - 来自 Fragment
1.6.2
:当使用clearBackStack
删除一组 Fragment 时,任何嵌套 Fragment 的ViewModel
现在将在父 Fragment 的ViewModels
被清除时被清除。 (I6d83c,b/296173018)
版本 1.7.0-alpha06
2023 年 10 月 4 日
androidx.fragment:fragment-*:1.7.0-alpha06
已发布。 版本 1.7.0-alpha06 包含以下提交。
依赖项更新
- Fragments 已更新为依赖于 Transition
1.5.0-alpha04
中添加的新animateToStart
API。
版本 1.7.0-alpha05
2023 年 9 月 20 日
androidx.fragment:fragment-*:1.7.0-alpha05
已发布。 版本 1.7.0-alpha05 包含以下提交。
新功能
- Fragments 现在提供对使用 Androidx Transitions 的 Predictive back 的支持。这使您可以使用后退手势在决定通过完成手势提交或取消事务之前,使用自定义 Androidx Transition 向后搜索到上一个 Fragment。您必须依赖于 Transition
1.5.0-alpha03
版本来启用此功能。 (Ib49b4,b/285175724)
已知问题
- 当前存在一个问题,即在您使用过渡取消后退手势后,下次开始后退手势时,它将无法运行过渡,从而导致空白屏幕。这可能是 Transition 库中的问题造成的。 (b/300157785)。如果您遇到此问题,请 对 Fragment 提交问题,并附上一个可以重现问题的示例项目。您可以使用 Activity 的
onCreate()
中的FragmentManager.enabledPredictiveBack(false)
禁用预测性后退。
版本 1.7.0-alpha04
2023 年 9 月 6 日
androidx.fragment:fragment-*:1.7.0-alpha04
已发布。 版本 1.7.0-alpha04 包含以下提交。
錯誤修復
- 修复了取消预测性后退手势时 Fragment 无法进入正确 Lifecycle 状态的问题。 (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 包含以下提交。
錯誤修復
- 修复了 Fragments 在使用预测性后退时出现的问题,该问题会导致 Fragment 管理器的回退堆栈中的第一个 Fragment 被跳过,并且在使用系统后退(通过 3 键导航或预测性后退手势)时 Activity 会结束。 (I0664b,b/295231788)
版本 1.7.0-alpha02
2023 年 8 月 9 日
androidx.fragment:fragment-*:1.7.0-alpha02
已发布。 版本 1.7.0-alpha02 包含以下提交。
錯誤修復
- 当从 API 34 使用带有预测性后退手势的 Fragments 时,如果您使用的是不支持搜索的过渡系统 (
Animations
、Transitions
) 或根本没有过渡,Fragments 现在将在手势完成之前等待执行后退操作。 (I8100c)
版本 1.7.0-alpha01
2023 年 6 月 7 日
androidx.fragment:fragment-*:1.7.0-alpha01
已发布。此版本是在内部分支中开发的。
新功能
- Fragments 现在提供对使用
Animator
的预测性应用内后退的支持。这使您可以使用后退手势查看上一个 Fragment 的自定义动画,然后决定是通过完成手势提交事务还是取消事务。您还可以使用实验性的enablePredictiveBack()
并传入false
来禁用此新行为。
版本 1.6
版本 1.6.2
2023 年 11 月 1 日
androidx.fragment:fragment-*:1.6.2
已发布。 版本 1.6.2 包含以下提交。
錯誤修復
- 当
FragmentContainerView
的 Fragment 被填充时,其状态(如FragmentManager
、Host 和 id)现在可以在onInflate
回调中访问。 (I1e44c,b/307427423) - 当使用
clearBackStack
删除一组 Fragment 时,任何嵌套 Fragment 的ViewModel
现在将在父 Fragment 的ViewModels
被清除时被清除。 (I6d83c,b/296173018)
版本 1.6.1
2023 年 7 月 26 日
androidx.fragment:fragment-*:1.6.1
已发布。 版本 1.6.1 包含以下提交。
錯誤修復
- 修复了当 Activity 停止但未销毁时存储的保存状态在 Fragment 实例被移回
RESUMED
状态后仍会错误地被缓存的问题。如果该 Fragment 实例在使用多个回退堆栈 API 来保存和恢复该 Fragment 时位于回退堆栈中,这会导致该缓存状态被重用。 (I71288,b/246289075)
依赖项更新
- Fragment 现在依赖于 Activity 1.7.2。这修复了 Kotlin 用户无法在没有对 Activity 的明确依赖项的情况下扩展
ComponentDialog
的问题。 (b/287509323)
版本 1.6.0
2023 年 6 月 7 日
androidx.fragment:fragment-*:1.6.0
已发布。 版本 1.6.0 包含以下提交。
自 1.5.0 以来的重要更改
Fragment
的保存状态已完全在私有库状态(自定义Parcelable
类)和开发人员提供的状态之间拆分,该状态现在始终存储在Bundle
中,允许确切地确定 Fragment 状态的来源。FragmentManager.OnBackStackChangedListener
接口已扩展了两个额外的回调onBackStackChangeStarted
和onBackStackChangeCommitted
,它们分别在每个Fragment
被添加到或从 Fragment 回退堆栈中删除之前以及在事务提交之后被调用。FragmentStrictMode
添加了一个新的WrongNestedHierarchyViolation
,用于检测子 Fragment 嵌套在父级的 View 层次结构中,但未添加到父级的childFragmentManager
中。- 采用
Intent
或IntentSender
的Fragment
和FragmentManager
API 现在已正确使用@NonNull
进行注释,以防止传入空值,因为空值始终会立即使这些方法调用的相应 Android 框架 API 崩溃。 DialogFragment
现在通过requireComponentDialog()
API 提供对底层ComponentDialog
的访问权限。- Fragment 现在依赖于 Lifecycle
2.6.1
. - Fragment 现在依赖于 SavedState
1.2.1
. - Fragment 现在依赖于 ProfileInstaller
1.3.0
. fragment-testing-manifest
工件将清单条目与 fragment-testing 组件的其余部分分离。这意味着您可以执行以下操作debugImplementation("androidx.fragment:fragment-testing-manifest:X.Y.Z") androidTestImplementation("androidx.fragment:fragment-testing:X.Y.Z")
这避免了由于
fragment-testing
和androidx.test
之间的版本偏差而导致的冲突
版本 1.6.0-rc01
2023 年 5 月 10 日
androidx.fragment:fragment-*:1.6.0-rc01
已发布。 版本 1.6.0-rc01 包含以下提交。
錯誤修復
- 修复了导致
ActivityResult
在连续进行多个startActivityForResult
请求时使用不正确的请求代码发送的问题。 (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 包含以下提交。
錯誤修復
- 使用带有超时设置的
postponeEnterTransition
然后替换延迟的片段不再导致泄漏延迟的片段。 (I2ec7d, b/276375110) - 新的
onBackStackChangeStarted
和onBackStackChangeCommitted
回调现在只会在片段被多个事务包含时,只分派一次。
版本 1.6.0-alpha09
2023 年 4 月 5 日
androidx.fragment:fragment-*:1.6.0-alpha09
已发布。 版本 1.6.0-alpha09 包含以下提交。
API 变更
DialogFragment
现在可以通过requireComponentDialog()
API 访问底层的ComponentDialog
。- 片段
commitNow()
、executePendingTransactions()
和popBackStackImmediate()
API 已用@MainThread
注释,这意味着它们现在在没有从主线程调用时都会抛出构建错误,而不是等到运行时才失败。
錯誤修復
- 修复了
FragmentManager
中的一个 bug,该 bug 会导致在同一帧中保存和恢复导致崩溃。 OnBackStackChangedListener
的onBackStackChangeStarted
和onBackStackChangeCommitted
回调现在只会在FragmentManager
回退栈发生更改时才会执行。
版本 1.6.0-alpha08
2023 年 3 月 22 日
androidx.fragment:fragment-*:1.6.0-alpha08
已发布。 版本 1.6.0-alpha08 包含以下提交。
行为变更
OnBackStackChangedListener.onBackStackChangeCommited
回调的时机已调整为在片段操作执行之前执行。这样可以确保回调永远不会传递一个分离的片段。
錯誤修復
- 从 Fragment
1.5.6
: 修复了一个问题,即如果Lifecycle
已经处于STARTED
状态并且结果已经可用,那么在setFragmentResultListener
内调用clearFragmentResultListener
将不起作用。
依赖项更新
- Fragment 现在依赖于 Lifecycle
2.6.1
。 - Fragment 现在依赖于 SavedState
1.2.1
。 - Fragment 现在依赖于 ProfileInstaller
1.3.0
。
版本 1.6.0-alpha07
2023 年 3 月 8 日
androidx.fragment:fragment-*:1.6.0-alpha07
已发布。 版本 1.6.0-alpha07 包含以下提交。
錯誤修復
- 从 Fragment
1.5.6
: 修复了一个问题,即删除任何片段(无论它是否添加了菜单项)都会使活动的菜单无效。
版本 1.6.0-alpha06
2023 年 2 月 22 日
androidx.fragment:fragment-*:1.6.0-alpha06
已发布。 版本 1.6.0-alpha06 包含以下提交。
行为变更
FragmentManager
的onBackStackChangedListener
上的新的onBackStackChangeStarted
回调现在将在片段开始移动到目标状态之前执行。
版本 1.6.0-alpha05
2023 年 2 月 8 日
androidx.fragment:fragment-*:1.6.0-alpha05
已发布。 版本 1.6.0-alpha05 包含以下提交。
新功能
FragmentManager.OnBackStackChagnedListener
接口现在提供了两个额外的回调,onBackStackChangeStarted
和onBackStackChangeCommitted
,这些回调允许在FragmentManager
中发生回退栈更改时提供更多信息和控制。
API 变更
- 现在已用
@NonNull
正确地注释了接受Intent
或IntentSender
的Fragment
和FragmentManager
API,以防止传入空值,因为空值会立即使这些方法调用的相应 Android 框架 API 崩溃。
版本 1.6.0-alpha04
2022 年 12 月 7 日
androidx.fragment:fragment-*:1.6.0-alpha04
已发布。 版本 1.6.0-alpha04 包含以下提交。
新功能
FragmentStrictMode
添加了一个新的WrongNestedHierarchyViolation
,用于检测子片段是否嵌套在父片段的视图层次结构中,但没有添加到父片段的childFragmentManager
中。
行为变更
- 片段现在在
onAttach()
之前恢复其SavedStateRegistry
状态,确保它可以从所有上行生命周期方法中获得。
API 变更
fragment-testing-manifest
工件将清单条目与 fragment-testing 组件的其余部分分离。这意味着您可以执行以下操作
debugImplementation("androidx.fragment:fragment-testing-manifest:X.Y.Z")
androidTestImplementation("androidx.fragment:fragment-testing:X.Y.Z")
这避免了由于 fragment-testing
和 androidx.test
之间的版本偏差造成的冲突。
錯誤修復
- 从 Fragment
1.5.5
: 片段不再将ViewModel
状态错误地保存为视图注册表保存状态的一部分。
版本 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()
覆盖中调用超类。
錯誤修復
- 修复了由于集成新的提供程序回调接口(
OnConfigurationChangedProvider
、OnMultiWindowModeChangedProvider
、OnTrimMemoryProvider
、OnPictureInPictureModeChangedProvider
)导致的回归,以确保片段始终获得正确的回调。
版本 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 包含以下提交。
錯誤修復
- 从 Fragment
1.5.2
: 修复了一个问题,即同时执行popBackStack()
和replace()
事务会导致退出片段运行错误的Animation
/Animator
。
版本 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
1.5.1
: 修复了DialogFragmentCallbacksDetector
中的回归,其中使用与 AGP 7.4 捆绑在一起的 lint 版本会导致 lint 崩溃。
依赖更新
- 从 Fragment
1.5.1
: Fragment 库现在依赖于 Lifecycle2.5.1
。 - 从 Fragment
1.5.1
: Fragment 库现在依赖于 Activity1.5.1
。
版本 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 包含以下提交。
錯誤修復
- 使用带有超时设置的
postponeEnterTransition
然后替换延迟的片段不再导致泄漏延迟的片段。 (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 包含以下提交。
錯誤修復
- 修复了删除任何 Fragment(无论它是否添加了菜单项)都会使 Activity 的菜单失效的问题。(50f098, b/244336571)
- 修复了在
setFragmentResultListener
内调用clearFragmentResultListener
时,如果Lifecycle
已经STARTED
并且结果已经可用,则该方法无效的问题。(If7458)
版本 1.5.5
2022 年 12 月 7 日
androidx.fragment:fragment:1.5.5
、androidx.fragment:fragment-ktx:1.5.5
和 androidx.fragment:fragment-testing:1.5.5
已发布。 版本 1.5.5 包含这些提交。
錯誤修復
- Fragments 将不再错误地将
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 包含这些提交。
錯誤修復
- 修复了使用自定义
FragmentController
与未实现提供程序回调接口(OnConfigurationChangedProvider
、OnMultiWindowModeChangedProvider
、OnTrimMemoryProvider
、OnPictureInPictureModeChangedProvider
)的主机并调用其已弃用的调度函数时无法调度到子片段的错误。(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 包含这些提交。
錯誤修復
- 修复了导致回退栈中的片段获得
onMultiWindowModeChanged()
、onPictureInPictureModeChanged()
、onLowMemory()
和onConfigurationChanged()
回调的错误。(I34581, I8dfe6, b/242570955) - 嵌套子片段将不再接收多个
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 包含这些提交。
錯誤修復
- 修复了同时执行
popBackStack()
和replace()
事务可能会导致退出片段运行错误的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 包含这些提交。
錯誤修復
- 修复了
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()
返回的默认对话框。 - 保存的实例状态重构 - Fragments 已经开始更改保存其实例状态的方式。这是为了帮助清楚地识别哪些状态已保存在片段中以及状态的来源。当前更改包括以下内容
FragmentManager
现在将其保存的实例状态保存到Bundle
中,而不是直接保存在自定义Parcelable
中。- 通过
Fragment Result APIs
设置但尚未交付的结果现在与FragmentManager
的内部状态分开保存。 - 与每个单独片段关联的状态现在与
FragmentManager
的内部状态分开保存,因此您可以将与单个片段关联的保存状态量与Fragment
调试日志中存在的唯一 ID 相关联。
其他更改
FragmentStrictMode
现在允许私有第三方片段使用allowViolation()
和类名来绕过特定违规处罚。- 为 Activity 的
ActionBar
提供菜单的 Fragment API 已弃用。在 Activity1.4.0
中添加的MenuHost
和MenuProvider
API 提供了一个可测试的、生命周期感知的等效 API 表面,Fragments 应该使用它。
版本 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 包含这些提交。
保存的实例状态重构
- 与每个单独片段关联的状态现在与
FragmentManager
的内部状态分开保存,因此您可以将与单个片段关联的保存状态量与 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
中。这是为了在 Fragments 实际保存的内容方面提供更多透明度的第一步。(I93807, b/207158202)- 通过 Fragment Result APIs 设置但尚未交付的结果现在与
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()
已弃用。要管理菜单及其菜单项,应改为使用新的菜单 API,如 Fragment1.5.0-alpha04
版本说明 中所述。(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 已弃用,因为它们将您的片段紧密耦合到您的 Activity,并且无法独立测试。在 Activity1.4.0-alpha01
中添加的MenuHost
和MenuProvider
API 提供了一个可测试的、生命周期感知的等效 API 表面,Fragments 应该使用它。(I50a59, I20758)
錯誤修復
SavedStateViewFactory
现在支持使用CreationExtras
,即使它是在使用SavedStateRegistryOwner
初始化时。如果提供了额外的信息,则会忽略初始化的参数。(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()
和类名绕过特定违规惩罚。 (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)
錯誤修復
- 从 Fragment
1.4.1
:FragmentContainerView
不再在从 xml 生成的视图 ID 为负值时抛出非法状态异常。 (Ic185b, b/213086140) - 从 Fragment
1.4.1
: 当使用自定义ownerProducer
lambda 与by viewModels()
延迟函数一起使用时,它现在将使用该所有者的defaultViewModelProviderFactory
(如果未提供自定义ViewModelProvider.Factory
),而不是始终使用片段的工厂。 (I56170, b/214106513) - 修复了从
Fragment
的registerForActivityResult()
回调中第一次访问ViewModel
时发生的崩溃。 (Iea2b3)
版本 1.4
版本 1.4.1
2022 年 1 月 26 日
androidx.fragment:fragment:1.4.1
, androidx.fragment:fragment-ktx:1.4.1
和 androidx.fragment:fragment-testing:1.4.1
已发布。 版本 1.4.1 包含这些提交。
錯誤修復
FragmentContainerView
不再在从 xml 生成的视图 ID 为负值时抛出非法状态异常。 (Ic185b, b/213086140)- 当使用自定义
ownerProducer
lambda 与by viewModels()
延迟函数一起使用时,它现在将使用该所有者的defaultViewModelProviderFactory
(如果未提供自定义ViewModelProvider.Factory
),而不是始终使用片段的工厂。 (I56170, b/214106513)
版本 1.4.0
2021 年 11 月 17 日
androidx.fragment:fragment:1.4.0
, androidx.fragment:fragment-ktx:1.4.0
和 androidx.fragment:fragment-testing:1.4.0
已发布。 版本 1.4.0 包含这些提交。
自 1.3.0 以来重要的更改
FragmentStrictMode
API 提供运行时检查,允许您验证您的应用程序或您依赖的库是否没有调用已弃用的片段 API。当检测到违规时,您可以选择打印日志消息、触发您自己的自定义侦听器或使您的应用程序崩溃。控制启用哪些检查以及触发哪些“惩罚”的FragmentStrictMode.Policy
可以通过新的setStrictModePolicy()
方法设置在FragmentManager
上。该策略适用于该FragmentManager
,并且传递给任何未设置其自身唯一策略的子片段管理器。请参阅 片段的 StrictMode。FragmentContainerView
现在提供一个getFragment()
方法,该方法返回最近添加到容器的片段。这使用与findFragmentById()
相同的逻辑,使用FragmentContainerView
的 ID,但允许链接调用。val navController = binding.container.getFragment<NavHostFragment>().navController
FragmentScenario
现在实现Closeable
,允许您使用 Kotlin 的use
方法或 try-with-resources。添加了
FragmentTransaction#TRANSIT_FRAGMENT_MATCH_ACTIVITY_{OPEN, CLOSE}
以指定是否在片段转换中启用从主题中获取的标准 Activity 转换动画。FragmentManager.enableNewStateManager(boolean)
的实验性 API 已被删除,并且 新的状态管理器 现在是唯一可用的选项。
多个回退栈
FragmentManager
保持一个回退栈,该回退栈由使用 addToBackStack()
的片段事务组成。这允许您弹出这些事务并返回到先前状态,使用 使用片段保存状态 的机制,以便您的片段可以适当地恢复其状态。
此版本通过提供三个新的 FragmentManager
API 来扩展这些机制:saveBackStack(String name)
、restoreBackStack(String name)
和 clearBackStack(String name)
。这些 API 使用与 addToBackStack()
相同的 name
来保存 FragmentTransaction
的状态以及在这些事务中添加的每个片段的状态,并允许您稍后恢复这些事务及其片段及其状态。这允许您通过保存当前回退栈并恢复已保存的回退栈来有效地“切换”多个回退栈。
saveBackStack()
的操作类似于 popBackStack()
,因为它是非同步的,并导致所有返回到该特定名称的片段事务被反转(“弹出”),并且任何添加的片段都被销毁和删除,但它在几个重要方面有所不同
saveBackStack()
始终是包含性的。- 与
popBackStack()
不同的是,如果在回退栈上找不到指定的名称,或者如果提供了 null 名称,则popBackStack()
将弹出回退栈上的所有事务,而saveBackStack()
如果您以前没有使用该确切的非空名称使用addToBackStack()
提交片段事务,则不会执行任何操作。 - 保存了从这些事务中添加的所有片段的状态。这意味着每个片段的视图状态都已存储,每个片段的
onSaveInstanceState()
都被调用并且该状态被恢复,并且与这些片段关联的任何ViewModel
实例都被保留(并且不会在它们上调用onCleared()
)。
可用于 saveBackStack()
的片段事务必须满足某些条件
- 每个片段事务都必须使用
setReorderingAllowed(true)
来确保事务可以作为单个原子操作恢复。 - 保存的事务集必须是自包含的(即,它们不能显式引用该事务集之外的任何片段),以确保它们可以在以后的任何时间恢复,无论在介入时间内对回退栈进行了哪些更改。
- 任何保存的片段都不能是保留的片段,也不能在其传递的子片段集中具有保留的片段,以确保
FragmentManager
在保存回退栈后不会返回任何对已保存片段的引用。
与 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 包含这些提交。
錯誤修復
- 父片段现在将在启动自己的回调之前将其整个层次结构向下调度
onHiddenChanged()
。 (Iedc20, b/77504618) - 从具有打开的键盘的片段转到具有回收器视图的片段时,键盘现在将自动关闭。 (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 生命周期使用情况更正为 Fragment 视图生命周期。 (aosp/1830457,b/200326272)
文档更新
- 现在,对由 Activity Result API 处理的 API 的弃用消息,即
startActivityForResult
、startIntentSenderForResult
、onActivityResult
、requestPermissions
和onRequestPermissionsResult
,都已扩展了更多详细信息。 (cce80f) - 对
Fragment
和DialogFragment
的onActivityCreated()
的弃用消息都已扩展了更多详细信息。 (224db4)
版本 1.4.0-alpha09
2021 年 9 月 15 日
androidx.fragment:fragment:1.4.0-alpha09
、androidx.fragment:fragment-ktx:1.4.0-alpha09
和 androidx.fragment:fragment-testing:1.4.0-alpha09
已发布。 版本 1.4.0-alpha09 包含这些提交。
新功能
- 您现在可以调用
clearBackStack(name)
来清除之前使用saveBackStack(name)
保存的任何状态。 (I70cd7)
API 变更
FragmentContainerView
类已用 Kotlin 重写,确保getFragment
函数将正确地尊重可空性。 (If694a,b/189629145)- FragmentStrictMode 现在用 Kotlin 编写 (I11767,b/199183506)
錯誤修復
- 修复了使用
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 包含这些提交。
錯誤修復
- 改进了
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 包含这些提交。
錯誤修復
- 修复了在快速切换多个后退栈时出现的问题,该问题会在还原
FragmentTransaction
时显示为IllegalStateException
,或者显示为 Fragment 的第二个副本。 (I9039f) - 修复了
FragmentManager
即使在通过saveBackStack()
保存的状态被还原后,也会保留该状态副本的问题。 (Ied212) DialogFragment
的dismissAllowingStateLoss()
方法在状态保存后调用时不再崩溃,具体情况下是通过show(FragmentTransaction, String)
方法添加 DialogFragment。 (I84422)
版本 1.4.0-alpha05
2021 年 7 月 21 日
androidx.fragment:fragment:1.4.0-alpha05
、androidx.fragment:fragment-ktx:1.4.0-alpha05
和 androidx.fragment:fragment-testing:1.4.0-alpha05
已发布。 版本 1.4.0-alpha05 包含这些提交。
錯誤修復
- 从 Fragment
1.3.6
开始:当根视图设置了transitionGroup=”true”
时,使用hide()
时,Fragment 的视图现在将正确地设置为GONE
。 (aosp/1766655,b/193603427) - 从 Fragment
1.3.6
开始:FragmentActivity
现在始终在它覆盖的生命周期回调中将其第一个操作解锁保存状态。 (I6db7a)
依赖更新
- 从 Fragment
1.3.6
开始:Fragments 现在依赖于 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
来保存其状态。saveAllState()
和restoreSavedState()
方法也已在FragmentController
中弃用。如果您使用FragmentController
在FragmentActivity
之外托管 Fragments,则应使您的FragmentHostCallbacks
实现SavedStateRegistryOwner
。 (Iba68e,b/188734238)
錯誤修復
- 修复了在同时运行使用
replace()
的FragmentTransaction
时,作为支持多个后退栈的一部分,对saveBackStack()
的调用会失败的问题。 (I73137) - 修复了在使用
restoreBackStack()
API 支持多个后退栈时,在手动还原包含多个交易的保存的后退栈后出现的NullPointerException
。这还修复了setReorderingAllowed(true)
未对所有交易进行检查的问题。 (I8c593) - 修复了
FragmentManager
在 Fragments 从FragmentManager
中移除后,仍然会错误地继续还原 Fragments 的先前保存状态,从而导致保存的状态随着时间的推移不断增长。 (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)
錯誤修復
- 从 Fragment
1.3.5
开始:修复了 Fragment1.3.4
中由 aosp/1679887 引入的共享元素过渡中的回归。Fragments 现在可以正确地处理过渡组(直接通过transitionGroup="true"
设置,或间接通过transitionName
或background
设置),共享元素将不再引发IndexOutOfBoundsException
。 (I16484,b/188679569,b/188969304) - 当您尝试隐藏正在移除的 Fragment 时,
FragmentManager
将不再崩溃。 (I573dd,b/183634730) - 当评估顶级变量时,
OnCreateDialogIncorrectCallback
lint 检查将不再崩溃。(0a9efa,b/189967522)
版本 1.4.0-alpha02
2021 年 6 月 2 日
androidx.fragment:fragment:1.4.0-alpha02
、androidx.fragment:fragment-ktx:1.4.0-alpha02
和 androidx.fragment:fragment-testing:1.4.0-alpha02
已发布。版本 1.4.0-alpha02 包含这些提交。
新功能
- 无论使用当前的严格模式策略,
FragmentStrictMode
现在将在通过FragmentManager
启用日志记录时始终记录违规行为。(I02df6,b/187872638) FragmentStrictMode
现在支持从严格模式Violation
中排除特定的Fragment
类,允许该类绕过任何处罚。(Ib4e5d,b/184786736)FragmentStrictMode
Violation
类已扩展为根据每个违规行为添加结构信息。这使您能够验证导致违规行为的确切原因以及违规的片段(If5118,b/187871150),每个Violation
包含以下内容WrongFragmentContainerViolation
现在包含Fragment
试图添加到其中的ViewGroup
。(I83c75,b/187871150)TargetFragmentUsageViolation
已扩展为SetTargetFragmentUsageViolation
、GetTargetFragmentUsageViolation
和GetTargetFragmentRequestCodeUsageViolation
,其中SetTargetFragmentUsageViolation
包含目标片段和请求代码。(I741b4,b/187871150)SetUserVisibleHintViolation
现在包含传递给setUserVisibleHint()
的布尔值。(I00585,b/187871150)FragmentTagUsageViolation
现在包含<fragment>
标签试图将片段膨胀到其中的ViewGroup
。(I5dbbc,b/187871150)FragmentReuseViolation
现在包含导致违规的Fragment
的先前实例的唯一 ID。(I0544d,b/187871150)RetainInstanceUsageViolation
现在是抽象的,并且有两个子类,SetRetainInstanceUsageViolation
和GetRetainInstanceUsageViolation
,分别代表违规类型的两种情况。(Ic81e5,b/187871150)
行为变更
FragmentContainerView
现在在尝试以编程方式或通过 XML 更改fitsSystemWindow
属性时抛出异常。应由每个单独的片段的视图处理内边距。(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()
方法,该方法返回最近添加到容器的片段。这使用与findFragmentById()
相同的逻辑,使用FragmentContainerView
的 ID,但允许链接调用。(Ife17a,b/162527857)val navController = binding.container.getFragment<NavHostFragment>().navController
添加了
FragmentTransaction#TRANSIT_FRAGMENT_MATCH_ACTIVITY_{OPEN, CLOSE}
以指定是否在片段过渡中启用从主题中获取的标准 Activity 过渡动画。(I46652)
多个回退栈
FragmentManager
保持一个回退栈,该回退栈由使用 addToBackStack()
的片段事务组成。这允许您弹出这些事务并返回到先前状态,使用 使用片段保存状态 的机制,以便您的片段可以适当地恢复其状态。
此版本通过提供两个新的 FragmentManager
API 扩展了这些机制:saveBackStack(String name)
和 restoreBackStack(String name)
。这些 API 使用与 addToBackStack()
相同的 name
来保存 FragmentTransaction
的状态以及在这些事务中添加的每个片段的状态,并允许您稍后还原这些事务及其片段以及它们的状态完好无损。这使您能够通过保存当前后退堆栈并恢复保存的后退堆栈来有效地“切换”多个后退堆栈。
saveBackStack()
的操作类似于 popBackStack()
,因为它是非同步的,并导致所有返回到该特定名称的片段事务被反转(“弹出”),并且任何添加的片段都被销毁和删除,但它在几个重要方面有所不同
saveBackStack()
始终是包含性的。- 与
popBackStack()
不同的是,如果在回退栈上找不到指定的名称,或者如果提供了 null 名称,则popBackStack()
将弹出回退栈上的所有事务,而saveBackStack()
如果您以前没有使用该确切的非空名称使用addToBackStack()
提交片段事务,则不会执行任何操作。 - 保存了从这些事务中添加的所有片段的状态。这意味着每个片段的视图状态都已存储,每个片段的
onSaveInstanceState()
都被调用并且该状态被恢复,并且与这些片段关联的任何ViewModel
实例都被保留(并且不会在它们上调用onCleared()
)。
可用于 saveBackStack()
的片段事务必须满足某些条件
- 每个片段事务都必须使用
setReorderingAllowed(true)
来确保事务可以作为单个原子操作恢复。 - 保存的事务集必须是自包含的(即,它们不能显式引用该事务集之外的任何片段),以确保它们可以在以后的任何时间恢复,无论在介入时间内对回退栈进行了哪些更改。
- 任何保存的片段都不能是保留的片段,也不能在其传递的子片段集中具有保留的片段,以确保
FragmentManager
在保存回退栈后不会返回任何对已保存片段的引用。
与 saveBackStack()
类似,如果您以前没有使用相同的名称调用过 saveBackStack()
,则 restoreBackStack()
不会执行任何操作。(b/80029773)
片段严格模式
FragmentStrictMode
API 提供 *运行时* 检查,允许您验证您的应用或您依赖的库是否没有调用已弃用的片段 API。当检测到违规行为时,您可以选择打印日志消息、触发您自己的自定义侦听器或使应用崩溃。FragmentStrictMode.Policy
控制启用哪些检查以及触发哪些“处罚”,可以通过新方法 setStrictModePolicy()
在 FragmentManager
上设置。该策略适用于该 FragmentManager
并传递给任何未设置自己唯一策略的子片段管理器。(#123,#131,#150,b/143774122)
detectFragmentReuse()
检测以前删除的Fragment
实例是否正在重新添加到FragmentManager
。在Fragment
被销毁并从FragmentManager
中删除后,您永远不应该与Fragment
实例进行交互或保留对它的引用。(#142,b/153738653)detectFragmentTagUsage()
检测您是否在布局 XML 中使用<fragment>
标签。在将片段作为布局的一部分膨胀时,您应该始终使用FragmentContainerView
。(#141,b/153738235)detectWrongFragmentContainer()
检测您是否将片段添加到 *不是*FragmentContainerView
的容器中。在布局中,您应该始终使用FragmentContainerView
作为片段的容器。(#146,b/181137036)detectRetainInstanceUsage()
检测您是否使用已弃用的setRetainInstance()
或getRetainInstance()
API。(#140,b/153737954)detectSetUserVisibleHint()
检测您是否使用已弃用的setUserVisibleHint()
API。(#136,b/153738974)detectTargetFragmentUsage()
检测您是否使用已弃用的setTargetFragment()
、getTargetFragment()
或getTargetRequestCode()
API。(#139,b/153737745)
API 变更
FragmentManager.enableNewStateManager(boolean)
的实验性 API 已被删除,新的状态管理器 现在是唯一可用的选项。(I90036,b/162776418)FragmentScenario
现在实现了Closeable
,允许您使用 Kotlin 的use
方法或 try-with-resources。(#121,b/143774122)
新的 Lint 检查
UseGetLayoutInflater
Lint 检查现在会在DialogFragment
中使用LayoutInflater.from(Context)
时发出警告 - 您应该始终使用对话框片段的getLayoutInflater()
方法来获取适合LayoutInflater
的方法。(#156,b/170781346)DialogFragmentCallbacksDetector
Lint 检查现在会在DialogFragment
的onCreateDialog()
方法中调用setOnCancelListener
或setOnDismissListener
时发出警告 - 这些侦听器由DialogFragment
本身拥有,您应该覆盖onCancel()
和onDismiss()
以接收这些回调。(#171,b/181780047,b/187524311)
錯誤修復
- 从 Fragment 1.3.4 开始:修复了在 Fragment
1.3.3
中使用ViewTreeViewModelStoreOwner.get()
API 与ViewModelProvider
或 Jetpack Compose 方法viewModel()
在 Fragment 中引入的回归。这些用例现在正确地使用了您的 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 开始:您现在可以在进程死亡后从片段结果包中检索 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 包含这些提交。
錯誤修復
- 来自 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
开始:Fragments 现在依赖于 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 包含这些提交。
錯誤修復
- 通过 aosp/1679887 在 Fragment
1.3.4
中引入的共享元素转换中的回归已修复。Fragment 现在可以正确处理过渡组(直接通过transitionGroup="true"
或间接通过transitionName
或background
设置),共享元素将不再抛出IndexOutOfBoundsException
。(I16484, b/188679569, b/188969304)
版本 1.3.4
2021 年 5 月 18 日
androidx.fragment:fragment:1.3.4
, androidx.fragment:fragment-ktx:1.3.4
和 androidx.fragment:fragment-testing:1.3.4
已发布。 版本 1.3.4 包含这些提交。
錯誤修復
- 修复了在 Fragment
1.3.3
中使用 Hilt 时,使用ViewTreeViewModelStoreOwner.get()
API 与ViewModelProvider
或 Jetpack Compose 的viewModel()
方法在 Fragment 中引入的回归。这些用例现在将正确使用 Fragment 提供的ViewModelProvider.Factory
(如果它覆盖了getDefaultViewModelProviderFactory()
,就像@AndroidEntryPoint
注释的 Fragment 那样)。如果你没有覆盖该方法,将创建一个保存和恢复其状态并与 Fragment 的视图一起保存的SavedStateViewModelFactory
作为默认工厂。(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
时现在可以使用SavedStateRegistryOwner
,该SavedStateRegistryOwner
是通过使用 Fragment 的视图对ViewTreeSavedStateRegistryOwner.get()
进行操作来返回的。(I21acf, b/181577191)
錯誤修復
- 修复了在 Fragment
1.3.2
中引入的回归,该回归会导致在弹出包含setPrimaryNavFragment
操作的FragmentTransaction
时,popEnter
动画无法运行,例如NavHostFragment
使用的那些动画。(I38c87, b/183877426) FragmentContainerView
现在确保每个Fragment
都分发一组新的WindowInsets
,确保每个 Fragment 现在可以独立地使用这些内边距。(I63f68, b/172153900)DialogFragment
现在可以正确处理将子 Fragment 添加到与你的自定义Dialog
类中的容器具有相同 ID 的容器的情况,在重复使用内部使用的 ID(如BottomSheetDialog
使用的 ID)时,修复了视图层次结构问题。(Ie6279, b/180021387)FragmentManager.dump()
现在可以正确缩进活动 Fragment 列表中的第一个 Fragment。(If5c33, b/183705451)
新的状态管理器错误修复
- 新的 Fragment 状态管理器现在可以正确处理使用隐藏操作的退出过渡。(I9e4de, b/184830265)
版本 1.3.2
2021 年 3 月 24 日
androidx.fragment:fragment:1.3.2
, androidx.fragment:fragment-ktx:1.3.2
和 androidx.fragment:fragment-testing:1.3.2
已发布。 版本 1.3.2 包含这些提交。
新的状态管理器错误修复
- 当同时运行
popBackStack()
和commit()
操作时,最后一个操作现在将设置所有动画的方向,而不是运行一些弹出动画和一些进入动画。(I7072e, b/181142246) - 在共享元素层次结构中的视图将不再在进行共享元素转换时清除其转换名称。(I4d4a6, b/179934757)
依赖项更新
- Fragment 现在依赖于 Activity 1.2.2,修复了在使用 Fragment 1.3.1 或更高版本时,Activity 的
InvalidFragmentVersionForActivityResult
lint 检查出现的问题。 - Fragment 现在依赖于 Lifecycle 2.3.1。
版本 1.3.1
2021 年 3 月 10 日
androidx.fragment:fragment:1.3.1
, androidx.fragment:fragment-ktx:1.3.1
和 androidx.fragment:fragment-testing:1.3.1
已发布。 版本 1.3.1 包含这些提交。
新功能
- 位于
DialogFragment
中的 Dialog 现在可以通过其 DecorView 访问 ViewTree 所有者,确保DialogFragment
可以与ComposeView
一起使用。(Ib9290, b/180691023)
錯誤修復
- 使用 FragmentContainerView 膨胀到已
RESUMED
的活动中的 Fragment,现在在配置更改后将正确显示。(Ie14c8, b/180538371) - Fragment
toString()
的末尾不再有额外的}
(I54705, b/177761088) - FragmentActivity 中的覆盖方法现在可以正确继承基本方法 javaDoc (I736ce, b/139548782)
setFragmentResult
和setFragmentResultListener
的文档已更新其参数文档以反映它们不再接受可空值 (I990ba, b/178348386)
新的状态管理器错误修复
- 修复了由
mFocusedView
引起的 Fragment 中的内存泄漏 (Ib4e9e, b/179925887) - Fragment 现在在使用显示/隐藏事务时将正确调用
onCreateOptionsMenu
(I8bce8, b/180255554) - 在 Fragment 布局之前开始转换的子 Fragment 现在将正确达到
RESUMED
(Ic11e6, b/180825150) - 使用
<fragment>
标签膨胀的 Fragment 现在将始终达到RESUMED
(I452ac, (I9fa49)
依赖项更新
- Fragment 1.3.1 依赖于 Activity
1.2.1
。(I557b9)
版本 1.3.0
2021 年 2 月 10 日
androidx.fragment:fragment:1.3.0
, androidx.fragment:fragment-ktx:1.3.0
和 androidx.fragment:fragment-testing:1.3.0
已发布。 版本 1.3.0 包含这些提交。
自 1.2.0 以来的主要变化
- 新的状态管理器:
FragmentManager
的内部结构进行了重大 重写,修复了围绕生命周期事件、动画和转换的分发以及延迟 Fragment 处理的许多问题。 活动结果 API 集成:添加了对 活动
1.2.0
中引入的ActivityResultRegistry
API 的支持,以处理startActivityForResult()
+onActivityResult()
以及requestPermissions()
+onRequestPermissionsResult()
流,无需在您的 Fragment 中重写方法,此外还提供了用于测试这些流程的挂钩。请参阅更新后的 从活动获取结果。- 此版本修复了围绕无效请求代码和权限请求分发的多个问题,这些问题会阻止活动结果 API 在先前版本的
FragmentActivity
上运行。您必须升级到 Fragment 1.3.0 才能在FragmentActivity
或AppCompatActivity
中使用活动结果 API。
- 此版本修复了围绕无效请求代码和权限请求分发的多个问题,这些问题会阻止活动结果 API 在先前版本的
片段结果 API:添加了通过
FragmentManager
上的新 API 在两个 Fragment 之间传递结果的支持。这适用于层次结构片段(父级/子级)、DialogFragment 以及导航中的片段,并确保结果仅在您的 Fragment 至少处于STARTED
状态时才发送给您的 Fragment。目标片段 API 已被弃用,取而代之的是这些新 API。请参阅 使用片段结果 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 的状态。- 现在有一个替代
FragmentScenario
API 的onFragment
,即 Kotlin 的具象化扩展方法withFragment
,它允许您返回一个值。值得注意的是,它会重新抛出给定块中引发的异常。
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_
动画更改:片段默认效果TRANSIT_FRAGMENT_OPEN
、TRANSIT_FRAGMENT_CLOSE
和TRANSIT_FRAGMENT_FADE
现在使用Animator
而不是Animation
。用于构建这些动画器的资源现在是私有的。setRetainInstance()
弃用:Fragment 上的setRetainInstance()
方法已被弃用。随着 ViewModel 的引入,开发人员拥有一个特定 API 用于保留与活动、片段和导航图相关联的状态。这允许开发人员使用普通的非保留 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
上方的问题;子对话框片段现在始终出现在父对话框片段上方。 (I30806、b/177439520) - 修复了使用
Animation
执行hide
操作会导致隐藏的片段在动画结束时闪烁的问题。 (I57e22、b/175417675) - 在视图层次结构附加之前添加了过渡的片段现在会正确地达到
RESUMED
。 (I1fc1d、b/177154873)
新的状态管理器错误修复
- Fragment 的视图
Lifecycle
现在会正确地处理 Fragment 的视图在Lifecycle
达到CREATED
之前被销毁的情况,避免出现“从 INITIALIZED 向下没有事件”的异常。 (eda2bd、b/176138645) - 使用
Animator
的片段在使用FragmentContainerView
时现在会按正确的顺序出现。 (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()
相同的逻辑,并且当父片段调用setMenuVisibility(false)
时不再被调用。 (Id7de8、b/173203654)
新的状态管理器错误修复
- 修复了在将具有
Animation
的片段添加到FragmentContainerView
然后使用弹出操作中断该添加操作时出现的泄漏和视觉伪像。 (I952d8) - 修复了如果在片段的
onCreate()
或onViewCreated()
方法期间替换片段,片段的视图将保留在视图层次结构中的问题。 (I8a7d5) - 当 Fragment 根视图恢复时,焦点现在会正确地恢复到这些视图。 (Ifc84b)
- 在同一个片段事务中组合弹出和替换操作现在将显示正确的动画 (Ifd4e4、b/170328691)
版本 1.3.0-beta02
2020 年 12 月 2 日
androidx.fragment:fragment:1.3.0-beta02
、androidx.fragment:fragment-ktx:1.3.0-beta02
和 androidx.fragment:fragment-testing:1.3.0-beta02
已发布。 版本 1.3.0-beta02 包含这些提交。
新功能
FragmentScenario
已完全转换为 Kotlin,同时通过使用 Kotlin 1.4 的函数接口维护源代码和二进制兼容性,用于FragmentAction
。 (I19d31)
行为变更
- 不使用
class
或android:name
属性膨胀片段的 FragmentContainerView 现在可以在FragmentActivity
之外使用。 (Id4397、b/172266337) - 尝试将片段的最大 Lifecycle 设置为
DESTROYED
现在将抛出IllegalArgumentException
(Ie7651、b/170765622) - 使用
DESTROYED
状态初始化 FragmentScenario 现在将抛出IllegalArgumentException
(I73590、b/170765622)
新的状态管理器错误修复
- 修复了如果中断使用
Animator
或其中一个TRANSIT_FRAGMENT_
选项的片段过渡,视图将不会达到其最终状态的问题。 (I92426、b/169874632) - 修复了阻止具有退出
Animation
的片段正确销毁的问题。 (I83d65) - 具有反转效果的退出片段现在会正确地取消并使用正确的进入效果重新启动。 (I62226、b/167092035)
- 修复了
hide()
的退出Animator
不会运行的问题。 (Id7ffe) - 片段现在会在推迟后立即启动时正确地显示。 (Ie713b、b/170022857)
- 在动画期间移除其焦点视图的片段将不再尝试在达到
RESUMED
后恢复已分离视图的焦点 (I38c65、b/172925703)
外部贡献
FragmentFactory
现在为不同的ClassLoader
实例分别缓存片段类。感谢 Simon Schiller!(#87, b/113886460)
版本 1.3.0-beta01
2020 年 10 月 1 日
androidx.fragment:fragment:1.3.0-beta01
、androidx.fragment:fragment-ktx:1.3.0-beta01
和 androidx.fragment:fragment-testing:1.3.0-beta01
已发布。 版本 1.3.0-beta01 包含这些提交。
新功能
setMaxLifecycle()
现在支持将Lifecycle
状态设置为INITIALIZING
,只要片段尚未移动到CREATED
。(b/159662173)
API 变更
- 升级 androidx 以使用 Kotlin 1.4 (Id6471, b/165307851, b/165300826)
行为变更
- 片段资源文件已正确设为私有。(aosp/1425237)
錯誤修復
- 使用
<fragment>
标签膨胀的片段现在将适当地等待其视图添加到容器中,然后再移动到 STARTED (I02f4c) - 可见然后
setMaxLifecycle()
设置为CREATED
的片段现在会适当地运行其退出效果。(b/165822335) - 删除未添加到回退栈的已分离片段不再会导致内存泄漏。感谢 Nicklas Ansman Giertz!(b/166489383)
- 活动片段现在将始终具有非空
FragmentManager
,而具有非空FragmentManager
的片段将始终被视为活动片段。(aosp/1422346) - 片段的默认效果,
TRANSIT_FRAGMENT_OPEN
、TRANSIT_FRAGMENT_CLOSE
和TRANSIT_FRAGMENT_FADE
,现在使用Animator
而不是Animation
。(b/166155034)
新的状态管理器错误修复
- 片段现在会适当地从其动画开始之前的状态恢复其视图焦点状态。(Icc256)
- 只有共享元素转换的片段现在会适当地完成其特殊效果,这意味着它们实际上会移动到其最终状态 (Iaebc7, b/166658128)
- 片段视图现在在被销毁之前始终从容器中删除。(Id5876)
- 新的状态管理器现在始终在添加进入片段视图之前删除退出片段视图。(I41a6e)
- 新的状态管理器现在会尊重对片段视图的可见性的显式更改。这意味着如果您在动画开始之前将进入片段的视图设置为
INVISIBLE
,它实际上会保持不可见。(b/164481490) - 片段现在优先考虑
Animators
而不是Animations
,这意味着同时具有两者功能的片段只会运行Animator
并忽略Animation
。(b/167579557) - 新的状态管理器不再导致片段在使用进入动画时闪烁。(b/163084315)
已知问题
在使用新的状态管理器时,如果在进入特殊效果期间按下后退按钮,而不是返回到上一个片段,则旧片段永远不会重新添加,导致屏幕空白。(b/167259187, b/167092035, b/168442830)
版本 1.3.0-alpha08
2020 年 8 月 19 日
androidx.fragment:fragment:1.3.0-alpha08
、androidx.fragment:fragment-ktx:1.3.0-alpha08
和 androidx.fragment:fragment-testing:1.3.0-alpha08
已发布。 版本 1.3.0-alpha08 包含这些提交。
新的状态管理器
此版本包含对 FragmentManager
内部状态管理的重大重构,这会影响生命周期方法的调度、动画和转换以及延迟事务的处理方式。这默认情况下启用。有关更多详细信息,请参阅 片段:重建内部博客文章。(b/139536619, b/147749580)
FragmentManager.enableNewStateManager(boolean)
中的实验性 API 可用于控制 FragmentManager 是否使用新的状态管理器。(I7b6ee)
以下问题仅在使用新的状态管理器时才会修复
- 在新的片段启动之前,
replace
操作的先前片段现在会正确停止。(b/161654580) - 片段现在可以防止在同一片段上出现多个竞争动画,避免出现
Animation
会覆盖所有Transition
效果,或者单个片段上的Animator
和Transition
都会运行的情况。(b/149569323) - 现在将运行所有进入和退出的片段的
enterTransition
和exitTranstion
,而不是仅运行最后一个进入片段和第一个退出片段。(b/149344150) - 延迟片段不再停留在
CREATED
状态,而是与其他片段一起移动到STARTED
。(b/129035555) - 修复了
FragmentManager
在混合使用延迟重新排序事务和非重新排序事务时,会以错误顺序执行操作的问题。(b/147297731) - 同时弹出多个片段将不再导致中间片段在延迟片段时暂时可见。(b/37140383)
FragmentManager
现在在从onAttachFragment()
回调中调用findFragmentById()
或findFragmentByTag()
时返回正确的片段。(b/153082833)- 当要替换它们的片段被延迟时,片段不再在要销毁的片段上调用
onCreateView()
。(b/143915710) - 尝试组合框架
Transition
和 AndroidXTransition
实例时的错误消息现在会提到具有无效转换的片段。(b/155574969)
行为变更
- 您现在可以在片段的
onCreate()
生命周期方法中对ActivityResultLauncher
调用launch()
。(b/161464278) - 在
onCreate()
之后调用registerForActivityResult()
现在会抛出异常,表明不允许这样做,而不是在配置更改后静默地无法传递结果。(b/162255449) FragmentActivity
现在使用在 Activity1.2.0-alpha08
中引入的OnContextAvailableListener
API 来恢复FragmentManager
的状态。添加到FragmentActivity
子类的任何侦听器都将在此侦听器之后运行。(I513da)
錯誤修復
- 使用
startIntentSenderForResult()
时传递的ActivityOptions
现在已得到尊重。(b/162247961)
已知问题
- 在使用新的状态管理器时,在
onViewCreated()
之后,在onResume()
之前直接设置片段根视图的可见性会导致FragmentManager
覆盖您设置的可见性,它控制根视图的可见性。作为解决方法,您应始终使用hide()
和show()
操作来更改片段的可见性。(b/164481490)
版本 1.3.0-alpha07
2020 年 7 月 22 日
androidx.fragment:fragment:1.3.0-alpha07
、androidx.fragment:fragment-ktx:1.3.0-alpha07
和 androidx.fragment:fragment-testing:1.3.0-alpha07
已发布。 版本 1.3.0-alpha07 包含这些提交。
新功能
FragmentScenario
现在支持设置CREATED
、STARTED
或RESUMED
的初始生命周期状态,而不是始终将片段移动到RESUMED
状态。(b/159662750)- 添加了
FragmentScenario
API 的onFragment
的替代方案,即 Kotlin 重新化的扩展方法withFragment
,它允许您返回一个值。值得注意的是,它会重新抛出在给定块中引发的异常。(b/158697631)
行为变更
FragmentScenario
现在使用setMaxLifecycle()
来实现moveToState()
,确保在所有 API 级别上的一致行为,并将片段的状态与底层 Activity 解耦。(b/156527405)ViewTreeSavedStateRegistryOwner
返回的SavedStateRegistryOwner
现在与片段视图的生命周期绑定在一起。这确保了它与其状态在同一时间保存和恢复。(b/158503763)
錯誤修復
- 片段现在在调用
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 之外的其他 FragmentManagers。(I06d3d)
錯誤修復
- 父片段现在会在其子片段之前恢复其视图状态,修复了配置更改后出现的一个视觉排序问题,其中一个
DialogFragment
会显示另一个DialogFragment
作为子片段。(b/157195715) - 修复了
UseRequireInsteadOfGet
Lint 检查无法正确处理?.
和!!
运算符的链式使用的问题。(b/157677616)
版本 1.3.0-alpha05
2020 年 5 月 20 日
androidx.fragment:fragment:1.3.0-alpha05
、androidx.fragment:fragment-ktx:1.3.0-alpha05
和 androidx.fragment:fragment-testing:1.3.0-alpha05
已发布。 版本 1.3.0-alpha05 包含以下提交。
新功能
- 在
Fragment
内使用View
时,添加了对来自 Lifecycle2.3.0-alpha03
的ViewTreeViewModelStoreOwner
和来自 SavedState1.1.0-alpha01
的ViewTreeSavedStateRegistryOwner
的支持。(aosp/1297993, aosp/1300264)
API 变更
setFragmentResult()
和setFragmentResultListener()
API 现在分别接受非空的Bundle
和FragmentResultListener
。 要显式清除先前设置的结果或侦听器,请使用新的clearFragmentResult()
和clearFragmentResultListener()
方法。(b/155416778)- 接受 lambda 的
setFragmentResultListener()
Kotlin 扩展现在标记为inline
。(b/155323404)
行为变更
- 以前已弃用的
startActivityForResult()
、startIntentSenderForResult()
和Fragment
上的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
状态时才发送给您的 Fragment。(b/149787344)
API 变更
- 目标 Fragment API 已弃用。 要在 Fragment 之间传递数据,应改用新的 Fragment 结果 API。(b/149787344)
- Fragment 上的
startActivityForResult()
/onActivityResult()
和requestPermissions()
/onRequestPermissionsResult()
API 已弃用。 请使用 Activity 结果 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
将 Fragment 添加到DialogFragment
的视图层次结构时出现的illegalStateException
。(b/154366601) - Fragment 上的
getDefaultViewModelProviderFactory()
方法在将您的 Fragment 托管在 Activity 之外时不再崩溃。(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)
錯誤修復
- 修复了 Fragment
1.3.0-alpha02
中在使用BottomSheetDialogFragment
时引入的回归问题。(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 规则,因为它们的生命周期和视图生命周期始终保持同步,这使得在调用observe
时安全地使用this
或viewLifecycleOwner
。(b/151765086)
依赖项更改
- Fragment 依赖于 Activity
1.2.0-alpha03
,该版本对 Activity1.2.0-alpha02
中引入的 Activity 结果 API 做出了重大改进。
版本 1.3.0-alpha02
2020 年 3 月 18 日
androidx.fragment:fragment:1.3.0-alpha02
、androidx.fragment:fragment-ktx:1.3.0-alpha02
和 androidx.fragment:fragment-testing:1.3.0-alpha02
已发布。 版本 1.3.0-alpha02 包含以下提交。
新功能
- 添加了对 Activity
1.2.0-alpha02
中引入的ActivityResultRegistry
API 的支持,以处理startActivityForResult()
+onActivityResult()
以及requestPermissions()
+onRequestPermissionsResult()
流程,而无需在您的 Fragment 中覆盖方法,此外还为测试这些流程提供了挂钩。 请参阅更新的 从 Activity 获取结果。(b/125158199)
API 变更
DialogFragment
现在提供了一个接受@LayoutRes
的构造函数,该构造函数指示onCreateView()
默认应膨胀的布局。(b/150327080)onActivityCreated()
方法现在已弃用。 触碰 Fragment 视图的代码应在onViewCreated()
(在onActivityCreated()
之前立即调用)中完成,其他初始化代码应在onCreate()
中完成。 要在 Activity 的onCreate()
完成时专门接收回调,应在onAttach()
中将LifeCycleObserver
注册到 Activity 的Lifecycle
上,并在收到onCreate()
回调后将其删除。(b/144309266)
錯誤修復
- 来自 Fragment
1.2.3
: 修复了DialogFragment
中的一个错误,该错误会导致在从onCreateDialog()
中调用getLayoutInflater()
时出现StackOverflowError
。(b/117894767, aosp/1258664) - 来自 Fragment
1.2.3
: 缩小了 Fragment 包含的 ProGuard 规则的范围,以确保可以剥离未使用的 Fragment 类。(b/149665169) - 来自 Fragment
1.2.3
: 在使用隐藏 Kotlin 属性名称的局部变量名称时,修复了UseRequireInsteadOfGet
Lint 检查中的误报。(b/149891163) - 来自 Fragment
1.2.3
:FragmentContainerView
在布局预览中不再为使用不正确的构造函数抛出UnsupportedOperationException
。(b/149707833)
已知问题
BottomSheetDialogFragment
无法在屏幕上正确定位其对话框。(b/151652127)
版本 1.3.0-alpha01
2020 年 3 月 4 日
androidx.fragment:fragment:1.3.0-alpha01
、androidx.fragment:fragment-ktx:1.3.0-alpha01
和 androidx.fragment:fragment-testing:1.3.0-alpha01
已发布。 版本 1.3.0-alpha01 包含以下提交。
新功能
- 添加了对 Lifecycle
2.3.0-alpha01
中添加的ViewTreeLifecycleOwner.get(View)
API 的支持,这样它将返回 Fragment 的viewLifecycleOwner
作为onCreateView()
返回的任何视图的LifecycleOwner
。(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) FragmentContainerView
在 Android Studio 中使用布局预览时不再抛出UnsupportedOperationException
。 (b/149707833)- 修复了保留的片段在状态保存后添加不会持续重新创建然后在每次配置更改后销毁的问题。 (b/145832397)
版本 1.2.5
版本 1.2.5
2020 年 6 月 10 日
androidx.fragment:fragment:1.2.5
、androidx.fragment:fragment-ktx:1.2.5
和 androidx.fragment:fragment-testing:1.2.5
已发布。 版本 1.2.5 包含以下提交。
錯誤修復
- 片段的
getViewLifecycleOwner()
现在在调用onSaveInstanceState()
之前停止,反映了片段生命周期的行为。 这之前在 Fragment1.3.0-alpha04
中发布。 (b/154645875) - 在片段上调用
setMenuVisibility(false)
现在会正确更改其子片段提供的菜单的可见性。 这之前在 Fragment1.3.0-alpha04
中发布。 (b/153593580)
版本 1.2.4
版本 1.2.4
2020 年 4 月 1 日
androidx.fragment:fragment:1.2.4
、androidx.fragment:fragment-ktx:1.2.4
和 androidx.fragment:fragment-testing:1.2.4
已发布。 版本 1.2.4 包含以下提交。
錯誤修復
- 更新了 Fragment ProGuard 规则,以允许对保留的片段进行混淆。 (b/151605338)
- 在
DialogFragment
类上禁用了FragmentLiveDataObserve
Lint 规则,因为它们的生命周期和视图生命周期始终同步,因此在调用observe
时使用this
或viewLifecycleOwner
是安全的。 (b/151765086)
版本 1.2.3
版本 1.2.3
2020 年 3 月 18 日
androidx.fragment:fragment:1.2.3
、androidx.fragment:fragment-ktx:1.2.3
和 androidx.fragment:fragment-testing:1.2.3
已发布。 版本 1.2.3 包含以下提交。
錯誤修復
- 修复了
DialogFragment
中的错误,该错误会导致在从onCreateDialog()
中调用getLayoutInflater()
时出现StackOverflowError
。 (b/117894767, aosp/1258665) - 缩小了 Fragment 包含的 ProGuard 规则的范围,以确保可以剥离未使用的 Fragment 类。 (b/149665169)
- 修复了在使用与 Kotlin 属性名称相同的局部变量名称时,
UseRequireInsteadOfGet
Lint 检查中的误报。 (b/149891163) FragmentContainerView
不再抛出UnsupportedOperationException
,以在布局预览中使用不正确的构造函数。 (b/149707833)
版本 1.2.2
版本 1.2.2
2020 年 2 月 19 日
androidx.fragment:fragment:1.2.2
、androidx.fragment:fragment-ktx:1.2.2
和 androidx.fragment:fragment-testing:1.2.2
已发布。 版本 1.2.2 包含以下提交。
新的 Lint 检查
- Lint 建议使用
viewLifecycleOwner
作为LifecycleOwner
来调用OnBackPressedDispatcher
中的onCreateView()
、onViewCreated()
和onActivityCreated()
。 (b/142117657) - 添加了一个新的 Lint 检查,以确认你在使用
fragment-testing
工件时使用了正确的debugImplementation
。 (b/141500106) - Fragment 现在建议使用关联的
require___()
方法来提供更具描述性的错误消息,而不是checkNotNull(get___())
、requireNonNull(get___())
或get___()!!
,用于所有包含get
和require
等效项的 Fragment API。 (aosp/1202883)
錯誤修復
- 修复了 Fragment ProGuard 文件,以避免 R8 警告 (b/148963981)
- 改进了现有的 Lint 检查,建议在使用
observe
时使用viewLifecycleOwner
,以处理livedata-ktx
扩展方法版本的observe
。 (b/148996309) - 修复了许多 Lint 检查的格式 (aosp/1157012)
外部贡献
- 感谢 Zac Sweers 代表 Slack 贡献了
require___()
Lint 检查! (aosp/1202883)
版本 1.2.1
版本 1.2.1
2020 年 2 月 5 日
androidx.fragment:fragment:1.2.1
、androidx.fragment:fragment-ktx:1.2.1
和 androidx.fragment:fragment-testing:1.2.1
已发布。 版本 1.2.1 包含以下提交.
错误修复
- 通过采用
Class
实例(或 Kotlin 反射版本)的add
和replace
方法添加的片段现在将通过 ProGuard 保留其默认构造函数。 (b/148181315) FragmentStatePagerAdapter
和FragmentPagerAdapter
在运行finishUpdate()
时不再捕获由FragmentManager
抛出的异常。 (aosp/1208711)- 修复了
FragmentManager.findFragment()
不适用于通过<fragment>
标签添加的片段的问题。 (b/147784323) - 使用
<fragment>
标签膨胀的片段现在在布局中时,始终在onCreate()
之前收到对onInflate()
的调用。 (aosp/1215856) - 在已销毁 Activity 时,对
FragmentManager
实例调用toString()
不再抛出NullPointerException
。 (b/148189412)
依赖项更改
- 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
或其他布局。 它还支持与<fragment>
标签相同的class
、android:name
和可选的android:tag
,但使用普通的FragmentTransaction
来添加此初始片段,而不是<fragment>
使用的自定义代码路径。 onDestroyView()
定时: Fragment 现在将在调用onDestroyView()
之前等待退出动画、退出框架过渡和退出 AndroidX 过渡(使用 Transition1.3.0
)完成。- 基于类的
add()
和replace()
: 在FragmentTransaction
上添加了add()
和replace()
的新重载,它们采用Class<? extends Fragment>
和可选的Bundle
参数。 这些方法使用你的FragmentFactory
来构造要添加的 Fragment 的实例。 使用反射类型的 Kotlin 扩展(例如fragmentTransaction.replace<YourFragment>(R.id.container)
)也已添加到fragment-ktx
中。 - Lifecycle ViewModel SavedState 集成:
SavedStateViewModelFactory
现在是使用by viewModels()
、by activityViewModels()
、ViewModelProvider
构造函数或ViewModelProviders.of()
和 Fragment 时使用的默认工厂。 - 新的 Lint 检查: 添加了一个新的 Lint 检查,以确保你在从
onCreateView()
、onViewCreated()
或onActivityCreated()
中观察LiveData
时使用getViewLifecycleOwner()
。 getFragmentManager()
已弃用: Fragment 上的getFragmentManager()
和requireFragmentManager()
方法已弃用,并替换为单个getParentFragmentManager()
方法,该方法返回 Fragment 添加到的非空FragmentManager
(你可以使用isAdded()
来确定是否可以安全调用)。FragmentManager.enableDebugLogging()
已弃用: 静态FragmentManager.enableDebugLogging
方法已弃用。 FragmentManager 现在会尊重Log.isLoggable()
用于标签FragmentManager
,允许你在不重新编译应用程序的情况下启用DEBUG
或VERBOSE
日志记录。
已知问题
- 仅通过
FragmentContainerView
上的class
或android:name
属性引用的片段不会被 ProGuard 自动保留,需要您为每个片段类手动添加保留规则。(b/142601969) - 在使用 XML 中的
FragmentContainerView
使用class
或android:name
添加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
中的回归,该回归导致onViewCreated()
在活动销毁期间被错误调用。(b/146290333) - 使用
<fragment>
标签添加的片段现在即使它们仅在某些情况下出现在布局中(即,仅在您的横向布局中),其非配置也会被清除。因此,即使不在您的布局中,这些片段也会正确地移至CREATED
,而不是被实例化但从未经过任何生命周期方法。(b/145769287)
版本 1.2.0-rc04
2019 年 12 月 18 日
androidx.fragment:fragment:1.2.0-rc04
、androidx.fragment:fragment-ktx:1.2.0-rc04
和 androidx.fragment:fragment-testing:1.2.0-rc04
已发布。 版本 1.2.0-rc04 包含以下提交。
错误修复
- 调整了
TRANSIT_FRAGMENT_OPEN
、TRANSIT_FRAGMENT_CLOSE
和TRANSIT_FRAGMENT_FADE
的动画,以避免视觉问题。(b/145468417)
版本 1.2.0-rc03
2019 年 12 月 4 日
androidx.fragment:fragment:1.2.0-rc03
、androidx.fragment:fragment-ktx:1.2.0-rc03
和 androidx.fragment:fragment-testing:1.2.0-rc03
已发布。 版本 1.2.0-rc03 包含以下提交。
错误修复
- 修复了一个非故意的行为更改,其中已移除的片段仍然被
findFragmentById()
/findFragmentByTag()
返回,而它们的退出动画/过渡正在运行。(b/143982969,aosp/1167585) - 当包含活动调用
onSaveInstanceState()
时,子片段现在会在其父片段之前被正确停止。(b/144380645) - 修复了在弹出隐藏的片段后视图被错误地标记为
INVISIBLE
的问题。(b/70793925) - 片段共享元素过渡现在可以处理已旋转、缩放等的视图。(b/142835261)
文档更新
- 阐明了围绕
setUserVisibleHint()
的弃用文档。(b/143897055) - 改进了关于
setFragmentFactory()
和getFragmentFactory()
的文档,以更好地表明设置FragmentFactory
也会影响子 FragmentManager。(aosp/1170095)
依赖项更改
- 片段现在依赖于 Lifecycle
2.2.0-rc03
、Lifecycle ViewModel SavedState1.0.0-rc03
和 Activity1.1.0-rc03
。
版本 1.2.0-rc02
2019 年 11 月 7 日
androidx.fragment:fragment:1.2.0-rc02
、androidx.fragment:fragment-ktx:1.2.0-rc02
和 androidx.fragment:fragment-testing:1.2.0-rc02
已发布。 版本 1.2.0-rc02 包含以下提交。
错误修复
- 在 Kotlin 中,当从
onCreateView()
、onViewCreated()
或onActivityCreated()
观察LiveData
时,使用getViewLifecycleOwner()
的 LintFix(在 Fragment1.2.0-rc01
中引入)现在使用 Kotlin 属性访问语法viewLifecycleOwner
,而不是getViewLifecycleOwner()
。(aosp/1143821)
版本 1.2.0-rc01
2019 年 10 月 23 日
androidx.fragment:fragment:1.2.0-rc01
、androidx.fragment:fragment-ktx:1.2.0-rc01
和 androidx.fragment:fragment-testing:1.2.0-rc01
已发布。 版本 1.2.0-rc01 包含以下提交。
新功能
FragmentContainerView
现在除了android:name
之外,还支持class
属性,镜像了<fragment>
标签的功能。(b/142722242)- 添加了一个新的 Lint 检查,以确保在从
onCreateView()
、onViewCreated()
或onActivityCreated()
观察LiveData
时使用getViewLifecycleOwner()
。(b/137122478)
错误修复
DialogFragment
上的onDismiss
和onCancel
回调现在保证传递给它们的DialogInterface
不为空,并且当它们执行时,getDialog()
返回不为空。(b/141974033)FragmentContainerView
现在将由class
或android:name
定义的片段添加为膨胀的一部分,确保findFragmentById()
和findFragmentByTag()
之后立即生效。(b/142520327)- 修复了
FragmentContainerView
中由于状态保存导致的IllegalStateException
。(b/142580713) - 修复了当
FragmentContainerView
类被混淆时,FragmentContainerView
中的UnsupportedOperationException
。(b/142657034)
已知问题
- 仅通过
FragmentContainerView
上的class
或android:name
属性引用的片段不会被 ProGuard 自动保留,需要您为每个片段类手动添加保留规则。我们已经禁用了建议切换到FragmentContainerView
的 Lint 规则,直到通过aapt2
修复此问题。(b/142601969)
版本 1.2.0-beta02
2019 年 10 月 11 日
androidx.fragment:fragment:1.2.0-beta02
、androidx.fragment:fragment-ktx:1.2.0-beta02
和 androidx.fragment:fragment-testing:1.2.0-beta02
已发布。 版本 1.2.0-beta02 包含以下提交。
错误修复
- 修复了 Fragment 的
onInflate()
未从FragmentContainerView
接收适当的属性,从而破坏了诸如NavHostFragment
之类的情况。(b/142421837)
版本 1.2.0-beta01
2019 年 10 月 9 日
androidx.fragment:fragment:1.2.0-beta01
、androidx.fragment:fragment-ktx:1.2.0-beta01
和 androidx.fragment:fragment-testing:1.2.0-beta01
已发布。 版本 1.2.0-beta01 包含以下提交。
新功能
FragmentContainerView
添加了对使用android:name
和可选android:tag
XML 属性添加初始片段的支持。与<fragment>
标签不同,FragmentContainerView
使用普通的FragmentTransaction
在幕后添加初始片段,允许对FragmentContainerView
进行进一步的FragmentTransaction
操作,并允许使用 View Binding 来布局。(b/139830628,b/141177981)- 片段现在包含一个 Lint 警告,提供一个快速修复以将
<fragment>
替换为FragmentContainerView
。(b/139830056)
错误修复
- 修复了使用
androidx.transition
时发生的ClassCastException
。(b/140680619) - 在使用 Transition
1.3.0-beta01
时,片段现在会在分派onDestroyView()
之前等待androidx.transition
过渡(除了框架过渡和动画,它们分别在 Fragment1.2.0-alpha03
和 Fragment1.2.0-alpha02
中修复)完成。(aosp/1119841) - 在使用 Transition
1.3.0-beta01
时,片段现在会在对同一个容器启动新的过渡/动画之前,正确地取消androidx.transition
过渡。(aosp/1119841) - 修复了在 API 17 及以下版本上,使用
FragmentContainerView
时,在片段的根视图上使用androidx.transition
过渡时出现的问题。(b/140361893) fragment-testing
工件现在依赖于 AndroidX Test1.2.0
,修复了与最新 Espresso 3.2.0 的不兼容问题。(b/139100149)- 删除了 FragmentManager 中
Log.w
的使用。(aosp/1126468)
已知问题
- 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 添加到的非空FragmentManager
(可以使用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 现在会在分派
onDestroyView()
之前等待过渡(除了动画,动画在 Fragment1.2.0-alpha02
中已修复)完成。(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 设备上活动使用的动画。(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)
错误修复
- 修复了在弹出使用
setPrimaryNavigationFragment()
(在replace()
之前)的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()
用于访问与活动相关的 ViewModel。 - 最大生命周期:您现在可以通过在
FragmentTransaction
上调用setMaxLifecycle()
为 Fragment 设置最大生命周期状态。这将取代现在已弃用的setUserVisibleHint()
。FragmentPagerAdapter
和FragmentStatePagerAdapter
有一个新的构造函数,允许您切换到新的行为。 - FragmentActivity 的 LayoutId 构造函数:
FragmentActivity
的子类现在可以选择调用FragmentActivity
上的构造函数,该构造函数接受一个R.layout
ID,表示应设置为内容视图的布局,作为在onCreate()
中调用setContentView()
的替代方法。这不会改变子类必须具有无参数构造函数的要求。 - Fragment 的 LayoutId 构造函数:
Fragment
的子类现在可以选择调用Fragment
上的构造函数,该构造函数接受一个R.layout
ID,表示应为此 Fragment 使用的布局,作为覆盖onCreateView()
的替代方法。膨胀的布局可以在onViewCreated()
中进行配置。 - 延迟并设置超时:已添加了
postponeEnterTransition()
的新重载,它接受超时。
版本 1.1.0-rc04
2019 年 8 月 7 日
androidx.fragment:fragment:1.1.0-rc04
、androidx.fragment:fragment-ktx:1.1.0-rc04
和 androidx.fragment:fragment-testing:1.1.0-rc04
已发布。此版本中包含的提交可以在 此处 找到。
错误修复
- Fragment 现在会在 Fragment 被弹出时正确取消延迟的过渡。(b/138251858)
版本 1.1.0-rc03
2019 年 7 月 19 日
androidx.fragment:fragment:1.1.0-rc03
、androidx.fragment:fragment-ktx:1.1.0-rc03
和 androidx.fragment:fragment-testing:1.1.0-rc03
已发布。此版本中包含的提交可以在 此处 找到。
错误修复
- 修复了多次使用超时调用
postponeEnterTransition()
时不会取消之前超时的的问题。(b/137797118)
版本 1.1.0-rc02
2019 年 7 月 17 日
androidx.fragment:fragment:1.1.0-rc02
、androidx.fragment:fragment-ktx:1.1.0-rc02
和 androidx.fragment-testing:fragment:1.1.0-rc02
已发布。此版本中包含的提交可以在 此处 找到。
错误修复
- 修复了在删除当前项时
FragmentPagerAdapter
和FragmentStatePagerAdapter
中发生的崩溃。(b/137209870)
版本 1.1.0-rc01
2019 年 7 月 2 日
androidx.fragment:fragment:1.1.0-rc01
、androidx.fragment:fragment-ktx:1.1.0-rc01
和 androidx.fragment:fragment-testing:1.1.0-rc01
已发布。此版本中包含的提交可以在 此处 找到。
错误修复
- 当过渡正在运行时,使用
show()
或hide()
操作时,片段现在可以正确更新其可见性。 (b/133385058) - 修复了在弹出使用
setPrimaryNavigationFragment()
(在replace()
之前)的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
已发布。此版本中包含的提交可以在 此处 找到。
错误修复
- 嵌套片段的
androidx.lifecycle.Lifecycle
回调(特别是与STARTED
、RESUMED
、PAUSED
、STOPPED
和DESTROYED
相关的回调)现在已正确嵌套。 (b/133497591) - 在片段的
onCreate()
中注册的OnBackPressedCallback
实例现在优先于子片段管理器。 (b/133175997) - 当父片段被替换时,子片段不再进行动画。 (b/121017790)
- 当使用
animateLayoutChanges="true"
时,片段动画和过渡现在被忽略,修复了片段未正确销毁的问题。 (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 更改
- 当主导航片段更改时,片段现在会收到对新的
onPrimaryNavigationFragmentChanged(boolean)
方法的回调。 aosp/960857
错误修复
- 子片段膨胀的菜单项现在会在父片段被移除时正确移除。 b/131581013
版本 1.1.0-alpha08
2019 年 5 月 7 日
androidx.fragment:fragment:1.1.0-alpha08
、androidx.fragment:fragment-ktx:1.1.0-alpha08
和 androidx.fragment:fragment-testing:1.1.0-alpha08
已发布。此版本中包含的提交可以在 此处 找到。
此版本与 Preferences 1.1.0-alpha01 到 1.1.0-alpha04 不兼容。使用此版本的片段时,请升级到 Preferences 1.1.0-alpha05。
新功能
- 添加了
postponeEnterTransition()
的一个新重载,它接受一个超时时间,在此之后,片段会自动调用startPostponedEnterTransition()
b/120803208
API 更改
- 重大变更:之前已弃用的
FragmentFactory
instantiate
方法(它接受一个Bundle
)已被移除。 aosp/953856 - 重大变更:
FragmentPagerAdapter
和FragmentStatePagerAdapter
中的RESUME_ONLY_CURRENT_FRAGMENT
和USE_SET_USER_VISIBLE_HINT
常量已分别重命名为BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT
和BEHAVIOR_SET_USER_VISIBLE_HINT
。 aosp/954782
错误修复
- 通过
setMaxLifecycle()
限制其生命周期的片段不再在到达其最终状态之前恢复。 b/131557151 - 当使用
setMaxLifecycle(Lifecycle.State.CREATED)
时,片段将正确销毁其视图。 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()
来为片段设置最大生命周期状态。这取代了现在已弃用的setUserVisibleHint()
。FragmentPagerAdapter
和FragmentStatePagerAdapter
具有一个新的构造函数,允许您切换到新的行为。 (b/129780800)
API 变更
FragmentScenario
上的moveToState(STARTED)
现在只能在 API 24+ 设备上调用。 (b/129880016)
行为变更
- 作为 (b/129907905) 的结果,后退栈中的片段 **不会** 在托管活动重新创建时收到对
onCreateView()
的回调。onCreateView()
现在只会在片段变为可见时(即后退栈被弹出)调用。
错误修复
- 修复了在 XML 中使用
<fragment>
标签以及FragmentActivity
或AppCompatActivity
的contentLayoutId
构造函数时出现的问题。 (b/129907905) - 修复了后退栈中的片段在配置更改后不会至少移动到
CREATED
的问题,导致视图模型和子保留片段未正确处置。 (b/129593351) - 修复了
restoreSaveState
中由实例状态保存后保留片段的同步错误引起的崩溃。 (b/130433793) (aosp/947824) - 修复了使用片段生命周期添加的
OnBackPressedCallback
在FragmentManager
具有后退栈时不会被调用的问题。有关更多详细信息,请参见 androidx.activity 1.0.0-alpha07。 (aosp/948209) - 片段不再为动画强制执行
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 抛出的异常现在在消息中包含片段的名称。 (b/67759402)
API 变更
Fragment
和FragmentActivity
现在包含一个接受@LayoutRes int
的第二个构造函数,它取代了之前用@ContentView
注释类的行为。这种方法在应用程序和库模块中都有效。 (b/128352521)- FragmentActivity 的
onActivityResult()
现在已正确标记为@CallSuper
。 (b/127971684) - 接受参数 Bundle 的 FragmentFactory 的
instantiate
方法已弃用,应用程序应使用不接受 Bundle 的新的instantiate
重载。 (b/128836103) FragmentScenario
方法现在已正确用@StyleRes
注释。 (aosp/924193)FragmentTabHost
已弃用。 (b/127971835)- FragmentActivity 的
getThemedContext()
已移除。 (aosp/934078)
错误修复
- 修复了 1.1.0-alpha05 中导致传入片段在屏幕上闪烁的回归问题。 (b/129405432)
- 修复了在执行一系列 popBackStack+replace+popBackStack 操作后主导航片段会丢失的问题。 (b/124332597)
- 修复了在还原片段状态时在您的活动上使用
@ContentView
构造函数出现的问题。 (b/127313094) - 更正了在用尚未附加到 FragmentManager 的片段替换现有目标片段时
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 的片段调用
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
测试托管片段的选项菜单 (b/121126668)
API 更改
- 添加了
requireArguments()
方法,该方法返回@NonNull Bundle
或抛出IllegalStateException
(b/121196360) - 添加了一个说明,指出
getLifecycle()
、getViewLifecycleOwner()
和getViewLifecycleOwnerLiveData()
不应该被重写,将在未来的版本中被设置为 final。如果您目前正在重写此方法,请 提交功能请求。 (aosp/880714) - 添加了一个说明,指出
getViewModelStore()
不应该被重写,将在未来的版本中被设置为 final。如果您目前正在重写此方法,请 提交功能请求。 (aosp/880713) - 修复了与之前版本 Fragment 的二进制兼容性问题。 (aosp/887877) (aosp/889834)
错误修复
- 当您将
null
传递给setTargetFragment()
时,目标 Fragment 会被正确清除。 (aosp/849969) - 修复了目标 Fragment 有时在
onDestroy()
中或之后不可用的问题。 (b/122312935) - DialogFragment 的 onDismiss() 现在在
onDestroy()
之前被调用。 (aosp/874133) (aosp/890734)
版本 1.1.0-alpha03
2018 年 12 月 17 日
新功能
- Fragment 现在实现了
BundleSavedStateRegistryOwner
并依赖于新发布的 SavedState 库 [aosp/824380] - 添加了一个
by activityViewModels
Kotlin 属性委托,用于检索与包含 Activity 关联的 ViewModel [b/119050253] - 扩展了
by viewModels
Kotlin 属性委托,使其可以接受一个可选的 lambda 方法来获取ViewModelStoreOwner
,允许您传入父 Fragment 或其他自定义的ViewModelStoreOwner
,代码如下:val viewModel: MyViewModel by viewModels(::requireParentFragment)
[b/119050253]
API 更改
FragmentScenario
现在允许您指定主题,例如Theme.AppCompat
[b/119054431]. 这是一个重大更改。- 添加了一个
requireView()
方法,该方法返回一个@NonNull View
或抛出一个IllegalStateException
[b/120241368] - 添加了一个
requireParentFragment()
方法,该方法返回一个@NonNull Fragment
或抛出一个IllegalStateException
[b/112103783]
错误修复
- 修复了 IllegalStateException: Failure saving state b/120814739
- 从保存的实例状态恢复的 Fragment 现在将始终收到一个非空的
Bundle
[b/119794496] - 删除了 Fragment 不会再重复使用它们的
Lifecycle
对象,如果重新添加 [b/118880674]
版本 1.1.0-alpha02
2018 年 12 月 3 日
新功能
- FragmentScenario 的 Kotlin 扩展现在允许您使用 lambda 来构造 Fragment,作为传递
FragmentFactory
实例的替代方法。 (aosp/812913)
错误修复
- 修复了在回退栈上使用嵌套 Fragment 时出现的 IllegalStateException (b/119256498)
- 修复了使用
FragmentScenario.recreate()
和FragmentFactory
时发生的崩溃 (aosp/820540) - 修复了一个问题,即在 Fragment 被移除后无法访问目标 Fragment (aosp/807634)
版本 1.1.0-alpha01
2018 年 11 月 5 日
这是 fragment-testing
工件和 FragmentScenario
的第一个版本,它构建在 androidx.test:core API 之上。有关更多详细信息,请参阅 Fragment 测试文档。
新功能
- 用于在隔离环境中测试 Fragment 的新 FragmentScenario 类。
- 您现在可以在任何
FragmentManager
上设置一个FragmentFactory
来控制如何实例化新的 Fragment 实例。 - 添加了一个新的
by viewModels()
Kotlin 属性委托,用于从 Fragment 中检索 ViewModel。 - 挂起的输入事件(如点击)现在在 Fragment 的
onStop()
中被取消。
API 更改
- 在 Fragment API 表面上显著扩展了可空性注释。
错误修复
- 修复了一个问题,该问题导致 Fragment 操作在 LiveData 中失败 (b/77944637)
已知问题
- 在 Fragment 从 FragmentManager 中移除后,无法访问目标 Fragment。
fragment-testing
依赖于androidx.test:core:1.0.0-beta01
而不是正确的androidx.test:core:1.0.0
。