【问题标题】:AppCompatDialogFragment views are null when starting AppCompatDialogFragment from Fragment从 Fragment 启动 AppCompatDialogFragment 时,AppCompatDialogFragment 视图为空
【发布时间】:2020-05-22 08:01:47
【问题描述】:

当我尝试访问视图(通过合成或 findViewById() )时,我的 AppCompatDialogFragment 中返回了 null。

我尝试在onCreateDialog() 方法中找到我的观点。我在下面附上了一张图片,这样你就可以看到调用和我的调试器结果:

我从我的 NutritionProgressFragment 开始这个 AppCompatDialogFragment,如下所示:

class NutritionProgressFragment : Fragment(), AddLogDialog.AddLogDialogListener {

    ...

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        add_log.setOnClickListener { openDialog() }
    }

    private fun openDialog() {
        val dialog = AddLogDialog(this)
        dialog.show(childFragmentManager, "example dialog")
    }
...
}

此外,我尝试了以下片段管理器,但都无法找到我的视图: childFragmentManager、parentFragmentManager、supportFragmentManager

同样奇怪的是,我可以在view 对象中找到我的视图。它在它的 mChildren 变量下,但具有与我的视图不同的 int ID 值。您可以在照片的第三个观察变量中看到我对内部存储的view ID 进行了硬编码,并且我能够找到我的 EditText(尽管它是 AppCompatEditText 而不是普通的 EditText)。显然,虽然我不能仅仅根据系统为我构建的内容对我的视图 ID 进行硬编码

有人知道为什么吗?我检查了许多 SO 帖子,但没有发现任何与我的问题相似且实际上已解决的问题。我很想知道这个问题的答案,而不是仅仅找到一些有用的东西然后忘记它。感谢您的帮助!

【问题讨论】:

  • 我认为您指的是片段根视图,而不是您膨胀的视图。
  • 我在第 26 行,因为我正在测试它是否有效(不幸的是它没有)。在第 27 行,我打电话给view.findViewById(...,不幸的是这也不起作用。无奈之下我只试过view.rootview...哈哈
  • R.id.calories_et 的布局名称是什么?
  • @VenomVendor 包含R.id.calories_et 的布局名称为dialog_add_log.xml
  • @Mackalester 那么第27行是对的,第26行是错的

标签: android android-fragments android-view android-dialogfragment


【解决方案1】:

我能够解决这个问题。事实证明,由于某种原因,这种情况下的调试器无法正确解释view?.findviewById,每次都返回null。但是,如果我通过在 view 对象上调用 findViewById 来获得我的意见,一切都会正常工作。所以我想如果其他人遇到这个问题,请尝试使用view.findviewById 运行您的代码,即使调试器说返回 null。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多