使用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
相关产品推荐
相关产品推荐

