如何在对话框中正确使用 FragmentResultListener

DVT*_*DVT 5 android android-fragments

我有一个用 DatePickerDialog 启动 DialogFragment 的片段。我想将日期传递回主机片段。我看到有人使用 setTargetFragment 但它已被弃用,并且在该函数的文档中它说使用 setFragmentResultListener,但 FragmentResultListener.onFragmentResult 函数似乎没有被调用。

我做错了什么以及什么是好的惯例?

主机片段:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    childFragmentManager.setFragmentResultListener(
        REQUEST_DATE,
        viewLifecycleOwner,
        this
    )
}

override fun onFragmentResult(requestKey: String, result: Bundle) {
    Log.d(TAG, "Key: $requestKey, Bundle: $result")
}
Run Code Online (Sandbox Code Playgroud)

对话:

val requestKey = requireArguments().getString(
    ARG_REQUEST_KEY,
    ""
)

val bundle = Bundle().apply {
    putSerializable(requestKey, resultDate)
}

requireParentFragment().setFragmentResult(
    requestKey,
    bundle
)
Run Code Online (Sandbox Code Playgroud)

另外,我在调用 DialogFragment.show 函数时传递主机片段的 childFragmentManager 。

ian*_*ake 4

您不想调用requireParentFragment().setFragmentResult- 这是在父 Fragment 的 FragmentManager 中设置结果。相反,您只想setFragmentResult()按照文档直接调用 Fragment :

val requestKey = requireArguments().getString(
    ARG_REQUEST_KEY,
    ""
)

val bundle = Bundle().apply {
    putSerializable(requestKey, resultDate)
}

setFragmentResult(
    requestKey,
    bundle
)
Run Code Online (Sandbox Code Playgroud)