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

使用Navigation Component显示DatePicker DialogFragment遇异常问题排查

解决DatePickerDialogFragment显示的BadTokenException问题

你的问题核心出在DatePickerDialog的Context使用错误,另外我也会帮你确认碎片ID的问题,一步步来:

1. 修复BadTokenException错误

你在创建DatePickerDialog时用了VitrixDataCollectionApp.context(Application级别的Context),但对话框必须依附于Activity的窗口才能显示,Application Context没有关联的Activity窗口令牌,所以会抛出Unable to add window -- token null is not valid的异常。

修改DatePickerFragment的onCreateDialog方法,改用DialogFragment自带的requireContext(),它会返回与当前碎片关联的Activity Context:

override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
    val c = Calendar.getInstance()
    val year = c.get(Calendar.YEAR)
    val month = c.get(Calendar.MONTH)
    val day = c.get(Calendar.DAY_OF_MONTH)
    // 替换为requireContext(),确保使用Activity级别的Context
    return DatePickerDialog(requireContext(), this, year, month, day)
}

2. 确认DatePicker碎片的ID是否为R.id.datePickerFragment

有两种简单的验证方式:

  • 直接查看你的导航图XML:里面的<dialog>标签明确写了android:id="@+id/datePickerFragment",这说明这个ID是正确的,只要你的XML没有语法错误,Android会自动生成对应的R.id.datePickerFragment。
  • 在代码中校验:在任意Activity/Fragment中输入R.id.datePickerFragment,如果Android Studio没有报红,说明这个ID已经被正确生成,可以正常使用。

额外小建议

  • 你当前的焦点监听逻辑已经做了hasFocus判断,避免了重复触发,这点很稳妥。
  • 你使用的NavController版本2.1.0-alpha04是比较旧的测试版,虽然这次的问题和版本无关,但后续如果遇到导航相关的奇怪问题,建议升级到最新的稳定版本,兼容性会更好。

内容的提问来源于stack exchange,提问作者DrkStr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:24:10