You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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实现,步骤如下:

  1. 在上层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")
        // 处理业务逻辑
    }
}
  1. 在子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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 16:06:02