你应该使用setTargetFragment方法。
此片段的可选目标。这可以用于,例如,如果
这个片段正在由另一个片段开始,完成后想要给
结果回到了第一个。此处设置的目标保留在
实例通过。
回到你的情况,从FragmentA开始FragmentB。
class FragmentA : Fragment() {
companion object {
val REQUEST_CODE_FRAGMENT_A = 1
}
override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View {
val view = inflater?.inflate(R.layout.fragment_a, container, false)!!
val fragmentB = FragmentB().apply {
setTargetFragment(this@FragmentA, REQUEST_CODE_FRAGMENT_A)
}
fragmentManager.beginTransaction()
.add(R.id.container, fragmentB, "fragB")
.addToBackStack(null)
.commit()
return view
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == REQUEST_CODE_FRAGMENT_A) {
if (resultCode == Activity.RESULT_OK) {
val message = data?.getStringExtra("message")
Toast.makeText(activity, message, Toast.LENGTH_SHORT).show()
}
}
}
}
当FragmentB从后台弹出时,onDestroy方法会被调用。
class FragmentB : Fragment() {
override fun onDestroy() {
// Notify for FragmentA (as target fragment) that FragmentB destroyed.
val intent = Intent().apply { putExtra("message", "I'm out.") }
targetFragment.onActivityResult(targetRequestCode, Activity.RESULT_OK, intent)
super.onDestroy()
}
}