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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 03:47:07