【Jetpack更新之Fragment】setRetainInstance 被弃用,那么 fragment 是如何保存状态的?...

随着Android Jetpack的更新,`setRetainInstance`方法已被弃用。官方推荐使用SaveState、ViewModel等API来保留Activity、Fragment和Navigation的状态,以避免内存泄漏并保持逻辑一致性。本文探讨了Fragment状态保存的新方法,并提到了相关资源供进一步学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们都知道 fragment 中的 setRetainInstance 用于控制是否在 activity 保留 fragment 实例,具体内容可参见 WanAndroid 的每日一问:Fragment 是如何被存储与恢复的?

但是该方法已于 androidx fragment 1.3.0-alpha01 弃用了

老规矩,我们查看一下 commit log

简单概况一下

SetRetainInstance 尝试在 activity 重建时保存状态。但它带来了很多副作用。

随着 ViewModel 的引入,开发者拥有一个特定的 API,用于保留与 Activity,Fragments 和 Navigation 相关联的状态。这使开发者可以使用正常的,不需要保留 fragment ,从而在保存单个需要的属性时避免了常见的泄漏源,并且可以销毁保存的状态(即 ViewModel 的构造器和 onCleared 回调)

详情可参见 【背上 Jetpack】绝不丢失的状态 androidx SaveState ViewModel-SaveState 分析 和 【背上 Jetpack 之 ViewModel】即使您不使用 MVVM 也要了解 ViewModel ——ViewModel 的职能边界

从这个改动可以看出官方正致力于保证逻辑的单一性,状态保存交给 ViewModel ,减少这种特殊的例外情况,从而消除一些不符合预期的问题

关于我

我是 Fly_with24

  • 掘金

  • 简书

  • Github

欢迎关注我的公众号

<think>嗯,用户问的是Android Support库里的Fragment是否已经不推荐使用了,以及新的替代方案是什么。我需要先确认Android Support库的状态。记得Google在Jetpack推出后,逐渐将Support库迁移到AndroidX,这是更现代的包结构。所以首先应该提到Support库被废弃,推荐使用AndroidX中的Fragment。 然后,具体到类名,用户提到的android.support.v4.app.Fragment确实已经被替代了。新的包名应该是androidx.fragment.app.Fragment。需要指出替代的路径,并强调两者功能相似,但AndroidX有更好的维护和兼容性。 接下来,用户可能需要迁移的步骤,比如如何迁移到AndroidX,使用Refactor工具,修改依赖项,还有需要注意的行为变化。例如,在AndroidX中Fragment的构造函数可能有变化,需要默认空参构造,还有FragmentManager的获取方式可能有区别,比如使用requireActivity()代替getActivity()。 另外,还要提到迁移的好处,比如持续的支持、新特性,以及和Jetpack其他组件的兼容性。可能用户实际遇到的问题不仅仅是替换包名,还有API的变化,所以需要提醒他们注意测试和可能的代码调整。 最后,总结一下步骤,确保用户有明确的行动指南,同时强调官方文档的重要性,提供链接方便他们查阅。要确保回答结构清晰,分点说明,这样用户容易理解和操作。</think>是的,`android.support.v4.app.Fragment` 已经**不再推荐使用**。以下是逐步说明和替代方案: --- ### 1. **AndroidX 迁移背景** - **废弃原因**:Google 在 2018 年推出 Jetpack 组件库(AndroidX),逐步取代旧的 Support 库。 - **新包路径**:`androidx.fragment.app.Fragment` 是替代方案,功能和 API 与旧版兼容,但维护更活跃。 --- ### 2. **迁移步骤** #### 步骤 1:修改依赖项 在 `build.gradle` 中替换旧依赖: ```gradle // 旧依赖(已废弃) implementation 'com.android.support:support-fragment:28.0.0' // 新依赖(AndroidX) implementation 'androidx.fragment:fragment:1.5.5' ``` #### 步骤 2:替换代码中的引用 - 旧版导入: ```java import android.support.v4.app.Fragment; ``` - 新版导入: ```java import androidx.fragment.app.Fragment; ``` #### 步骤 3:调整相关 API - **FragmentManager** 的获取方式: ```java // 旧版 getSupportFragmentManager(); // 新版(在 Activity 中) getSupportFragmentManager(); // 仍可用,但需确保 Activity 继承自 FragmentActivity // 或更安全的写法(在 Fragment 中): requireActivity().getSupportFragmentManager(); ``` --- ### 3. **需要注意的变更** - **构造函数要求**:AndroidX 的 Fragment 强制要求**空参构造方法**(通过反射实例化时)。 - **API 优化**: - 新增 `FragmentTransaction.setMaxLifecycle()` 控制生命周期。 - `onActivityCreated()` 被标记为废弃,建议用 `onViewCreated()` 替代。 --- ### 4. **迁移工具** - **Android Studio 自动迁移**: 1. 菜单选择 **Refactor → Migrate to AndroidX**。 2. 工具会自动替换包路径并检查兼容性。 --- ### 5. **迁移优势** - **长期支持**:AndroidX 是未来 Android 开发的标准。 - **新特性**:支持 ViewModel、LiveData 等 Jetpack 组件无缝协作。 - **行为修复**:旧版 Fragment 的某些 Bug 在 AndroidX 中已修复。 --- ### 6. **官方文档** - 最新 Fragment 文档:[Android Developers - Fragments](https://developer.android.com/guide/fragments) - 迁移指南:[AndroidX 迁移说明](https://developer.android.com/jetpack/androidx/migrate) --- 通过以上步骤,可平稳过渡到新版 Fragment。如果项目中仍有旧代码,建议尽快迁移以避免未来兼容性问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值