android 将数据从BottomSheetFragment传递到前一个Fragment

enxuqcxy  于 2023-05-15  发布在  Android
关注(0)|答案(3)|浏览(130)

除了侦听器之外,还有什么更好的方法可以将数据发送回前一个片段/父片段吗?
我有一个片段,其中包括项目列表。单击项目将打开底部工作表片段。在关闭底部工作表弹出窗口时,我需要将数据传递回片段本身。
到目前为止,我所做的就是创建一个侦听器并实现它。

fnvucqvd

fnvucqvd1#

这实际上取决于你使用的组件。如果您正在使用Android Jetpack组件,请查看这篇文章:LINK
您应该能够像使用startActivityForResult()传递数据那样来回传递数据
此外,当你在它也请查看官方文档,有一个很好的例子,将帮助您更好地理解这一点:LINK

dced5bon

dced5bon2#

虽然你提到监听器以外的任何方式,但根据文件:
从Fragment 1.3.0-alpha 04开始,每个FragmentManager实现FragmentResultOwner。这意味着FragmentManager可以充当片段结果的中央存储。此更改允许组件通过设置片段结果并侦听这些结果来相互通信…
为给定的requestKey设置FragmentResultListener。一旦给定的LifecycleOwner至少处于STARTED状态,setFragmentResult使用相同requestKey设置的任何结果都将被传递到回调。回调将保持活动状态,直到LifecycleOwner达到DESTROYED状态或使用相同的requestKey调用clearFragmentResultListener。
要将数据从片段B传递回片段A,首先在片段A(接收结果的片段)上设置一个结果侦听器。在片段A的FragmentManager上调用setFragmentResultListener(),如下图所示:
在您的BottomSheet类中:

btncloseBottomSheet.setOnClickListener {
            val result = Bundle().apply {
                // put your data in bundle
                putInt("MY_KEY", 6)
            }
            setFragmentResult("requestCode", result)
            dismiss()
        }

在前面的fragment/parent fragment中,需要实现FragmentResultListener:

class PreviousFragment : FragmentResultListener {
    ...
    
    override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            
            // set fragment listener
            parentFragmentManager.setFragmentResultListener(
                            "requestCode",
                            viewLifecycleOwner,
                            this
                    )
    
        }
    ...
    
    // get result from other fragments by FragmentResultListener
        override fun onFragmentResult(requestKey: String, result: Bundle) {
    
            when (requestKey) {
    
                "requestCode" -> {
                    val resultFromBundle = result.getInt("MY_KEY")
                    // Do somthing
                }
            }
    
        }

}
yfwxisqw

yfwxisqw3#

将数据从当前fragment/bottom sheet fragment传递到前一个片段/Activity的正确方法是-
底部工作表要从中传递数据的片段

requireActivity().supportFragmentManager.setFragmentResult(
        "requested_data_key",
        Bundle().apply { 
             putString("value_one_key", "abc")
             putString("value_two_key", "xyz")
        }
)

需要数据的活动/片段

override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
         setSelectedSchemeResultListener() 
    }
    
    private fun setSelectedSchemeResultListener() {
    Log.d("TAG11", "setSelectedSchemeResultListener: $supportFragmentManager")
    supportFragmentManager.setFragmentResultListener(SELECTED_SCHEME_ID, this) { _, bundle ->
        Log.d("TAG11", "setSelectedSchemeResultListener:${bundle[]} ")
        Log.d("TAG11", "setSelectedSchemeResultListener:value - ${bundle["value_one_key"]}")
    }
}

相关问题