FragmentManager 可以充当 Fragment 结果的集中存储区。此更改通过设置 Fragment 结果并监听这些结果,而不要求 Fragment 直接引用彼此,让单独的 Fragment 相互通信
如需将数据从 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))
}