关于fragment的数据传递问题

FragmentManager 可以充当 Fragment 结果的集中存储区。此更改通过设置 Fragment 结果并监听这些结果,而不要求 Fragment 直接引用彼此,让单独的 Fragment 相互通信
关于fragment的数据传递问题_第1张图片

如需将数据从 Fragment B 传回到 Fragment A,请先在接收结果的 Fragment A 上设置结果监听器。在 Fragment A 的 FragmentManager 上调用 setFragmentResultListener()

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setResultListener("requestKey") { key, bundle ->
         val result = bundle.getString("bundleKey")
        // Do something with the result...
    }
}

在生成结果的 Fragment B 中,您必须使用相同的 requestKey 在同一 FragmentManager 上设置结果。您可以使用 setFragmentResult() API 来完成此操作

button.setOnClickListener {
    val result = "result"
    setResult("requestKey", bundleOf("bundleKey" to result))
}

然后,在值为 STARTED 后,Fragment A 便会收到结果并执行监听器回调。

对于一个指定键,您只能有一个监听器和一个结果。如果您对同一个键多次调用 setResult(),则系统会将 Fragment B 从返回堆栈退出之前的最近结果发送给 Fragment A。如果您设置的结果没有相应的监听器来接收,则结果会存储在 FragmentManager 中,直到您设置一个具有相同键的监听器。请注意,监听器的 Fragment 必须为 STARTED,然后该 Fragment 才能收到结果。监听器收到结果并触发 onFragmentResult() 回调后,结果会被清除

如需将结果从子级 Fragment 传递到父级 Fragment,父级 Fragment 在调用 setFragmentResultListener() 时应使用 getChildFragmentManager() 而不是 getParentFragmentManager()

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    childFragmentManager.setResultListener("requestKey") { key, bundle ->
        val result = bundle.getString("bundleKey")
    }
}

子级 Fragment 在其 FragmentManager 上设置结果。然后,当父级 Fragment 为 STARTED 时便会收到结果

button.setOnClickListener {
    val result = "result"
    setResult("requestKey", bundleOf("bundleKey" to result))
}

你可能感兴趣的:(关于fragment的数据传递问题)