当片段成为堆栈的顶部时与片段进行通信?

时间:2018-09-13 00:13:24

标签: android android-fragments fragmentmanager

我有两个片段:FragmentAFragmentB。我从FragmentA开始ActivityMain,然后开始FragmentB而不从后退栈弹出FragmentA(我想在{{1 }})。最终,我完成了FragmentA的操作并将其从堆栈中弹出,但是我需要通知Fragment A FragmentB不再使用。

我如何与FragmentB交流,FragmentB已关闭,而FragmentA现在已成为后退堆栈的顶部?

我曾尝试在Fragment的许多类中设置断点,例如OnResume(),OnAttach,OnStart(),但没有遇到任何问题。

1 个答案:

答案 0 :(得分:1)

您应该使用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时,将调用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()
    }
}