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

MaterialDatePicker点击崩溃:仅深色主题下TextView填充失败

主Activity中MaterialDatePicker在深色主题下崩溃问题解决

问题现象

  • 仅在AppThemeDark深色主题下弹出MaterialDatePicker时触发崩溃
  • 点击日期选择器后抛出InflateException,根源是无法解析TextView依赖的主题属性

崩溃日志

Process: sergirex.portadasperiodicos, PID: 1900
android.view.InflateException: Binary XML file line #23 in sergirex.portadasperiodicos:layout/mtrl_picker_dialog: Binary XML file line #26 in sergirex.portadasperiodicos:layout/mtrl_picker_header_title_text: Error inflating class TextView
Caused by: android.view.InflateException: Binary XML file line #26 in sergirex.portadasperiodicos:layout/mtrl_picker_header_title_text: Error inflating class TextView
Caused by: java.lang.UnsupportedOperationException: Failed to resolve attribute at index 5: TypedValue{t=0x2/d=0x7f040109 a=23}, theme={InheritanceMap=[id=0x7f120492sergirex.portadasperiodicos:style/MaterialCalendarTheme, id=0x7f120300sergirex.portadasperiodicos:style/ThemeOverlay.MaterialComponents.MaterialCalendar, id=0x7f1202f4sergirex.portadasperiodicos:style/ThemeOverlay.MaterialComponents.Dialog, id=0x7f120088sergirex.portadasperiodicos:style/Base.ThemeOverlay.MaterialComponents.Dialog, id=0x7f1200a1sergirex.portadasperiodicos:style/Base.V14.ThemeOverlay.MaterialComponents.Dialog, id=0x7f1202a1sergirex.portadasperiodicos:style/ThemeOverlay.AppCompat.Dialog, id=0x7f120080sergirex.portadasperiodicos:style/Base.ThemeOverlay.AppCompat.Dialog, id=0x7f1200adsergirex.portadasperiodicos:style/Base.V21.ThemeOverlay.AppCompat.Dialog, id=0x7f1200c2sergirex.portadasperiodicos:style/Base.V7.ThemeOverlay.AppCompat.Dialog, id=0x7f12007csergirex.portadasperiodicos:style/Base.ThemeOverlay.AppCompat, id=0x7f120141sergirex.portadasperiodicos:style/Platform.ThemeOverlay.AppCompat], Themes=[sergirex.portadasperiodicos:style/MaterialCalendarTheme, forced, sergirex.portadasperiodicos:style/AppThemeDark, forced, sergirex.portadasperiodicos:style/SplashTheme, forced, sergirex.portadasperiodicos:style/Theme.AppCompat.Empty, forced, android:style/Theme.DeviceDefault.Light.DarkActionBar, forced]}
    at android.content.res.TypedArray.getColorStateList(TypedArray.java:600)
    at android.widget.TextView.readTextAppearance(TextView.java:4301)
    at android.widget.TextView.<init>(TextView.java:1275)
    at android.widget.TextView.<init>(TextView.java:1170)
    at androidx.appcompat.widget.AppCompatTextView.<init>(AppCompatTextView.java:113)
    at androidx.appcompat.widget.AppCompatTextView.<init>(AppCompatTextView.java:108)

相关代码

样式文件代码

<style name="AppTheme" parent="Theme.MaterialComponents.Light">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    ....
</style>
<style name="AppThemeDark" parent="ThemeOverlay.MaterialComponents.Dark">
    <!-- Customize your theme here. -->
    <item name="android:windowAnimationStyle">@style/WindowAnimationTransition</item>
    <item name="colorPrimary">@color/background_material_dark</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
   ....
</style>
<style name="MaterialCalendarTheme" parent="ThemeOverlay.MaterialComponents.MaterialCalendar">
    <!-- Buttons -->
    <item name="buttonBarPositiveButtonStyle">@style/TextButton</item>
    <item name="buttonBarNegativeButtonStyle">@style/TextButton</item>
</style>
<style name="TextButton" parent="Widget.MaterialComponents.Button.TextButton.Dialog">
    <item name="android:textColor">@android:color/white</item>
</style>

Java实现代码

MaterialDatePicker<Long> datePicker = MaterialDatePicker.Builder
                .datePicker().setTheme(R.style.MaterialCalendarTheme)
                .setTitleText("Select date").setSelection(today)
                .build();
        datePicker.show(getSupportFragmentManager(), "MATERIAL_DATE_PICKER");

解决方案

问题根源是AppThemeDark错误地使用ThemeOverlay.MaterialComponents.Dark作为父主题。ThemeOverlay系列主题仅用于局部覆盖现有主题的部分属性,不包含Activity主题所需的完整基础属性集合,导致MaterialDatePicker依赖的TextView样式属性无法解析。

修复步骤

  1. 修改AppThemeDark的父类为完整的Material深色主题,比如Theme.MaterialComponents.Dark或Theme.MaterialComponents.Dark.NoActionBar:
<style name="AppThemeDark" parent="Theme.MaterialComponents.Dark">
    <!-- Customize your theme here. -->
    <item name="android:windowAnimationStyle">@style/WindowAnimationTransition</item>
    <item name="colorPrimary">@color/background_material_dark</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <!-- 其他自定义属性 -->
</style>
  1. 若需要针对特定视图做主题覆盖,不要将Overlay作为Activity主题,而是通过布局的android:theme属性局部设置,或者在主题中通过themeOverlay属性引入:
<!-- 在Activity主题中引入Overlay -->
<style name="AppThemeDark" parent="Theme.MaterialComponents.Dark">
    <item name="android:theme">@style/YourCustomOverlay</item>
    <!-- 其他属性 -->
</style>
  1. 确保MaterialCalendarTheme的继承关系正确,其依赖的所有属性在父主题中都能找到,无需额外修改即可正常工作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 15:35:08