首页 > 解决方案 > 当它成为 backstack 的顶部时与 Fragment 通信?

问题描述

我有两个片段:FragmentAFragmentB. 我FragmentA从我的开始ActivityMain,然后我开始FragmentB而不FragmentA从后台弹出(我想FragmentA在 的背景中显示FragmentB)。最终我完成FragmentB并从后台弹出它,但我需要通知FragmentB不再使用的片段 A。

我如何与FragmentA那个FragmentB已经关闭并且FragmentA现在是后台堆栈的顶部进行通信?

我已经尝试在许多 Fragment 的类中放置断点,例如 OnResume()、OnAttach、OnStart(),但没有受到任何影响。

标签: androidandroid-fragmentsfragmentmanager

解决方案


您应该使用setTargetFragment方法。

此片段的可选目标。例如,如果此片段正在由另一个片段启动,并且完成后希望将结果返回给第一个片段,则可以使用此方法。此处设置的目标通过实例跨实例保留。

回到你的情况,FragmentBFragmentA.

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()
    }
}

推荐阅读