Android 14 Pixel设备TimePickerDialog调用崩溃问题求助
解决方案
1. 强制TimePicker使用时钟模式(规避Spinner模式系统bug)
崩溃根源是Android 14 3月安全更新后,Spinner样式的TimePicker内部出现EditText空指针问题。修改插件代码,强制TimePicker切换到传统时钟模式即可避开该bug:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { timeDialog.getWindow().getDecorView().post(new Runnable() { @Override public void run() { TimePicker timePicker = timeDialog.findViewById(android.R.id.timePicker); if (timePicker != null) { try { // 通过反射设置TimePicker为时钟模式(MODE_CLOCK) Method setModeMethod = TimePicker.class.getMethod("setMode", int.class); setModeMethod.invoke(timePicker, 1); // 1对应MODE_CLOCK,0为MODE_SPINNER } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { e.printStackTrace(); } } } }); }
2. 替换为自定义时间选择对话框实现
如果反射方法受限,可以放弃系统TimePickerDialog,改用第三方时间选择库或自行编写简单的时间选择对话框,完全避开系统存在bug的Spinner模式控件。
3. 临时修复:拦截焦点变化避免空指针
针对崩溃链中的焦点清空逻辑,可以尝试手动拦截TimePicker内部控件的焦点变化,避免触发空指针:
timeDialog.getWindow().getDecorView().post(new Runnable() { @Override public void run() { TimePicker timePicker = timeDialog.findViewById(android.R.id.timePicker); if (timePicker != null) { // 遍历内部控件,禁用焦点变化触发的空指针路径 ViewGroup root = (ViewGroup) timePicker.getChildAt(0); traverseViewGroup(root); } } private void traverseViewGroup(ViewGroup group) { for (int i = 0; i < group.getChildCount(); i++) { View child = group.getChildAt(i); if (child instanceof NumberPicker) { ((NumberPicker) child).setOnFocusChangeListener(null); } else if (child instanceof ViewGroup) { traverseViewGroup((ViewGroup) child); } } } });
4. 向Android官方反馈问题
尽管当前Google问题跟踪器暂无相关记录,仍可提交包含崩溃日志、复现步骤的新issue,推动官方修复该系统级bug。
内容的提问来源于stack exchange,提问作者Jon Schlossberg
相关产品推荐
相关产品推荐

