如何将带有数据 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
}
}
我有一个片段托管一个包含 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
}
}