Вы должны использовать setTargetFragment метод.
Необязательная цель для этого фрагмента.Это может быть использовано, например, если этот фрагмент запускается другим, и когда он закончится, хочет вернуть результат первому.Установленная здесь цель сохраняется для всех экземпляров через.
Вернемся к вашему случаю, когда старт FragmentB
из FragmentA
.
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
выскочил изbackstack, метод 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()
}
}