Android MaterialDatePicker空指针异常求助:调用getCurrentMonth()对象为空
问题描述
Crashlytics捕获到如下崩溃日志:
androidx.fragment.app.Fragment.performSaveInstanceState Fragment.java, line 3292 java.lang.NullPointerException: Attempt to invoke virtual method 'com.google.android.material.datepicker.Month com.google.android.material.datepicker.MaterialCalendar.getCurrentMonth()' on a null object reference com.google.android.material.datepicker.MaterialDatePicker.onSaveInstanceState MaterialDatePicker.java:154 androidx.fragment.app.Fragment.performSaveInstanceState Fragment.java:3292 androidx.fragment.app.FragmentStateManager.saveBasicState FragmentStateManager.java:681 androidx.fragment.app.FragmentStateManager.saveState FragmentStateManager.java:647 androidx.fragment.app.FragmentStore.saveActiveFragments FragmentStore.java:214 androidx.fragment.app.FragmentManager.saveAllStateInternal FragmentManager.java:2371 androidx.fragment.app.Fragment.performSaveInstanceState Fragment.java:3294 androidx.fragment.app.FragmentStateManager.saveBasicState FragmentStateManager.java:681 androidx.fragment.app.FragmentStateManager.saveState FragmentStateManager.java:647 androidx.fragment.app.FragmentStore.saveActiveFragments FragmentStore.java:214 androidx.fragment.app.FragmentManager.saveAllStateInternal FragmentManager.java:2371 androidx.fragment.app.Fragment.performSaveInstanceState Fragment.java:3294 androidx.fragment.app.FragmentStateManager.saveBasicState FragmentStateManager.java:681 androidx.fragment.app.FragmentStateManager.saveState FragmentStateManager.java:647 androidx.fragment.app.FragmentStore.saveActiveFragments FragmentStore.java:214 androidx.fragment.app.FragmentManager.saveAllStateInternal FragmentManager.java:2371
- 崩溃非必现,集中出现在Android 11、12、13系统的三星Galaxy机型上
- 当前使用的Material库版本:
implementation 'com.google.android.material:material:1.4.0'
解决方案
这个崩溃是Material库1.4.0版本中MaterialDatePicker的已知问题——在onSaveInstanceState方法里,未做判空就调用了MaterialCalendar.getCurrentMonth(),当日历控件还没完成初始化或被异常销毁时,就会触发空指针。可以通过以下两种方式修复:
1. 升级Material库版本
Google在后续版本中修复了该bug,建议升级到至少1.5.0及以上版本,示例依赖配置:
implementation 'com.google.android.material:material:1.5.0'
更推荐使用最新稳定版,能获得更多bug修复和功能优化。
2. 自定义MaterialDatePicker规避问题
如果暂时无法升级库版本,可以自定义MaterialDatePicker,重写onSaveInstanceState方法添加空指针判断:
public class SafeMaterialDatePicker<S> extends MaterialDatePicker<S> { @Override public void onSaveInstanceState(@NonNull Bundle outState) { try { // 通过反射获取calendar实例,避免直接调用引发空指针的逻辑 Field calendarField = MaterialDatePicker.class.getDeclaredField("calendar"); calendarField.setAccessible(true); MaterialCalendar calendar = (MaterialCalendar) calendarField.get(this); if (calendar != null) { super.onSaveInstanceState(outState); } else { // 日历控件为空时,仅保存父类基础状态 outState.putParcelable("super_state", super.onSaveInstanceState()); } } catch (NoSuchFieldException | IllegalAccessException e) { // 反射失败时 fallback 到父类方法,避免引发新异常 super.onSaveInstanceState(outState); } } }
使用时将原代码中的MaterialDatePicker替换为这个自定义类即可。
内容的提问来源于stack exchange,提问作者Han
相关产品推荐
相关产品推荐

