Dialog Fragment中打开子Dialog失败,求调用supportFragmentManager替代方案
解决Dialog Fragment中打开新Dialog Fragment的问题
可行的替代方法
1. 使用当前DialogFragment的getParentFragmentManager()
DialogFragment本身持有父级FragmentManager的引用,直接使用这个替代Activity的supportFragmentManager更可靠,适配当前DialogFragment已依附到Activity的场景:
SyncSovEntryFragment(Date(), it).apply { setListener { _, year, month, dayOfMonth -> Toast.makeText(requireContext(), "Set date: $year/$month/$dayOfMonth", Toast.LENGTH_LONG).show() } show(parentFragmentManager, "MonthYearPickerDialog") }
2. 使用getChildFragmentManager()(嵌套场景)
如果新DialogFragment需要作为当前DialogFragment的子Fragment进行生命周期联动管理,可改用这个方法:
show(childFragmentManager, "MonthYearPickerDialog")
3. 调整dismiss()的调用时机
你当前在打开新DialogFragment后立刻调用了dismiss(),这可能导致原DialogFragment提前销毁,干扰新DialogFragment的启动流程。可以将dismiss()移到新DialogFragment的回调中执行:
adapter.onItemClick = { SyncSovEntryFragment(Date(), it).apply { setListener { _, year, month, dayOfMonth -> Toast.makeText(requireContext(), "Set date: $year/$month/$dayOfMonth", Toast.LENGTH_LONG).show() // 在新DialogFragment的回调中关闭原DialogFragment dismiss() } show(parentFragmentManager, "MonthYearPickerDialog") } Toast.makeText(activity, it.database, Toast.LENGTH_LONG).show() // 注释掉原位置的dismiss() // dismiss() }
额外优化建议
ViewModel的getAll()如果返回LiveData,无需手动在IO线程调用,LiveData本身具备生命周期感知能力,可以简化协程代码:
val serverViewModel = ViewModelProvider(this)[ServerViewModel::class.java] serverViewModel.getAll().observe(requireActivity()) { s -> s?.let { adapter.setData(it) adapter.onItemClick = { // 点击逻辑... } } }
内容的提问来源于stack exchange,提问作者nrklhltyuan
相关产品推荐
相关产品推荐

