如何在PreferenceFragment中替换已废弃的setTargetFragment()方法
setTargetFragment 废弃替换方案
无数据回传需求
如果你跳转的子Fragment不需要给发起跳转的PreferenceFragment回传数据,直接删除代码里的setTargetFragment(caller, 0)行即可,其余代码无需修改,运行效果完全一致。
修改后代码如下:
override fun onPreferenceStartFragment( caller: PreferenceFragmentCompat, pref: Preference ): Boolean { // 实例化新Fragment val args = pref.extras val fragment = supportFragmentManager.fragmentFactory.instantiate( classLoader, pref.fragment ).apply { arguments = args // 已删除废弃的setTargetFragment调用 } // 替换当前Fragment supportFragmentManager.beginTransaction() .replace(R.id.settings, fragment) .addToBackStack(null) .commit() title = pref.title return true }
有数据回传需求
如果子Fragment需要返回数据给上层的PreferenceFragment,官方推荐使用Fragment Result API实现,步骤如下:
- 在上层PreferenceFragment(也就是代码中的
caller实例)的onCreate方法中注册结果监听:
// 自定义请求key,上下层Fragment保持一致即可 private const val PREF_RESULT_KEY = "preference_result_key" override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 注册结果回调 parentFragmentManager.setFragmentResultListener( PREF_RESULT_KEY, this ) { _, bundle -> // 取出子Fragment回传的数据,示例为String类型,可根据业务调整 val returnValue = bundle.getString("data_key") // 处理业务逻辑 } }
- 在子Fragment需要回传数据的位置调用发送方法:
// 组装需要回传的数据 val result = bundleOf( "data_key" to "需要回传的内容" ) // 发送结果 parentFragmentManager.setFragmentResult(PREF_RESULT_KEY, result) // 回退到上层PreferenceFragment parentFragmentManager.popBackStack()
复杂交互可选方案
如果两个Fragment之间交互逻辑复杂、需要传递的数据量大,可以使用挂载到宿主Activity的ViewModel共享数据,无需处理回调逻辑:
- 两个Fragment均获取相同Activity作用域的ViewModel实例
- 子Fragment修改ViewModel中的可观察数据,上层Fragment监听数据变化执行业务逻辑即可
内容的提问来源于stack exchange,提问作者Dave Enstrom
相关产品推荐
相关产品推荐

