You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 22:56:29