如何将带有数据 class 的数据从对话片段传递到另一个带有 kotlin 接口的片段?

How to pass data with data class from a dialog fragment to another fragment with interface in kotlin?

我有一个片段托管一个包含 EditText 字段的对话框片段。单击对话框片段中的按钮时,应将 EditText 字段中的数据传递给主机。

这是我一直在使用的:

宿主片段

class MeasurementsFragment : androidx.fragment.app.Fragment(), RecyclerClickListener {

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        /*Initialize Views*/
        display = binding.measurementsFragmentTestingTextView
        addMeasurementFab = binding.clientMeasurementFragmentAddMeasurementFab
        addMeasurementFab.setOnClickListener {
            AddMeasurementDialogFragment().show(childFragmentManager, "Dialog tag")
        }

    override fun onItemClicked1(dressMeasurementModel: DressMeasurementModel) {
        EditMeasurementDialogFragment().show(childFragmentManager, "Dialog tag")
    }

    override fun onItemClicked2(dressMeasurementModel: DressMeasurementModel) {
        Toast.makeText(requireContext(), "Position 2 was clicked", Toast.LENGTH_SHORT).show()
    }

}

对话片段

class AddMeasurementDialogFragment : DialogFragment(){
    private var _binding: AddMeasurementDialogFragmentBinding? = null
    private lateinit var addMeasurementButton: Button
    // This property is only valid between onCreateView and onDestroyView.
    private val binding get() = _binding!!

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        addMeasurementButton = binding.addMeasurementFragmentAddMeasurementButton
        addMeasurementButton.setOnClickListener {
            val measurementName = binding.addAddressFragmentMeasurementNameEditText.text.toString()
            val measurement = binding.addMeasurementFragmentAddMeasureEditText.text.toString().toBigDecimal()
            val action = AddMeasurementDialogFragmentDirections.actionAddMeasurementFragmentToMeasurementsFragment(
                DressMeasurementModel(measurementName, measurement)
            )
            findNavController().navigate(action)
        }
    }

    interface DialogFragmentInterface {
        fun passDataMethod(data:DressMeasurementModel)
    }

}

您可以使用 higher-order functions 来简化您的任务。

例如:

class AddMeasurementDialogFragment(
    private var onClick : (model: DressMeasurementModel) -> Unit = {  }
): DialogFragment(){---}

在处理点击的地方你只需要调用onClick() and pass data to it

onClick(dressMeasurementModel)

然后当你得到这个 class 的实例时,你只需要使用那个 onClick :

 val dialog= AddMeasurementDialogFragment()
          { selectedDressModel ->
           // HERE YOU GET THE DATA AND FURTHER CAN DO WHATEVER YOU WANT.
          }

不建议使用侦听器在 Fragment 和 Activity 之间进行通信。较新的方法是使用 FragmentResult API

当用户点击您的子片段时设置结果:

button.setOnClickListener {
    val editTextString = "..." // Get string from EditText
    // Use the Kotlin extension in the fragment-ktx artifact
    setFragmentResult("keyClicked", bundleOf("bundleKey" to editTextString))
}

在您的父片段中:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    // Set the listener to get notified when clicked
    // And retrieve the EditText data
    childFragmentManager.setFragmentResultListener("keyClicked") { key, bundle ->
        val editTextString = bundle.getString("bundleKey")
        // Do something with the string
    }
}