Android点击MaterialDateRangePicker出现布局加载异常及属性解析失败问题
问题:MaterialDateRangePicker点击时InflateException异常排查与解决
异常信息
android.view.InflateException: Binary XML file line #23 in com.dev:layout/mtrl_picker_dialog: Binary XML file line #17 in com.dev:layout/mtrl_picker_header_title_text: Error inflating class TextView Caused by: android.view.InflateException: Binary XML file line #17 in com.dev: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=0x7f0400bd a=6} at android.content.res.TypedArray.getColorStateList(TypedArray.java:596) at android.widget.TextView.readTextAppearance(TextView.java:3961) at android.widget.TextView.<init>(TextView.java:1064) at android.widget.TextView.<init>(TextView.java:968) at androidx.appcompat.widget.AppCompatTextView.<init>(AppCompatTextView.java:100) at androidx.appcompat.widget.AppCompatTextView.<init>(AppCompatTextView.java:95) at androidx.appcompat.app.AppCompatViewInflater.createTextView(AppCompatViewInflater.java:194) at androidx.appcompat.app.AppCompatViewInflater.createView(AppCompatViewInflater.java:115) at androidx.appcompat.app.AppCompatDelegateImpl.createView(AppCompatDelegateImpl.java:1551) at androidx.appcompat.app.AppCompatDelegateImpl.onCreateView(AppCompatDelegateImpl.java:1602) at android.view.LayoutInflater$FactoryMerger.onCreateView(LayoutInflater.java:242) at android.view.LayoutInflater.tryCreateView(LayoutInflater.java:1061) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:997) at android.view.LayoutInflater.parseInclude(LayoutInflater.java:1233) at android.view.LayoutInflater.rInflate(LayoutInflater.java:1119) at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:1084) at android.view.LayoutInflater.rInflate(LayoutInflater.java:1126) at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:1084) at android.view.LayoutInflater.rInflate(LayoutInflater.java:1126) at android.view.LayoutInflater.parseInclude(LayoutInflater.java:1231) at android.view.LayoutInflater.rInflate(LayoutInflater.java:1119) at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:1084) at android.view.LayoutInflater.inflate(LayoutInflater.java:682) at android.view.LayoutInflater.inflate(LayoutInflater.java:534) at android.view.LayoutInflater.inflate(LayoutInflater.java:481) at com.google.android.material.datepicker.MaterialDatePicker.onCreateView(MaterialDatePicker.java:209) at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2963) at androidx.fragment.app.DialogFragment.performCreateView(DialogFragment.java:489) at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:518) at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:282) at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:2189) at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:2100) at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:2002) at androidx.fragment.app.FragmentManager$5.run(FragmentManager.java:524) at android.os.Handler.handleCallback(Handler.java:883) at android.os.Handler.dispatchMessage(Handler.java:100) at android.os.Looper.loop(Looper.java:214) at android.app.ActivityThread.main(ActivityThread.java:7356) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
点击事件实现代码
MaterialDatePicker.Builder<Pair<Long, Long>> builder = MaterialDatePicker.Builder.dateRangePicker(); CalendarConstraints.Builder constraintsBuilder = new CalendarConstraints.Builder(); builder.setCalendarConstraints(constraintsBuilder.build()); MaterialDatePicker<?> picker = builder.build(); picker.show(getFragmentManager(), picker.toString());
当前已配置的主题样式
<item name="materialCalendarStyle">@style/Widget.MaterialComponents.MaterialCalendar</item> <item name="materialCalendarFullscreenTheme">@style/ThemeOverlay.MaterialComponents.MaterialCalendar.Fullscreen</item> <item name="materialCalendarTheme">@style/ThemeOverlay.MaterialComponents.MaterialCalendar</item> <item name="colorSurface">#FFFFFF</item>
原因分析
- 主题继承不完整:AppTheme未正确继承Material Components的基础主题,仅添加Calendar相关属性无法覆盖所有依赖的样式属性,导致TextView加载文本样式时无法解析缺失的颜色状态列表属性。
- FragmentManager兼容性问题:使用
getFragmentManager()而非Support版本的getSupportFragmentManager(),可能与MaterialDatePicker依赖的AndroidX Fragment存在兼容性冲突。 - 依赖版本不匹配:Material Components依赖版本与其他AndroidX依赖版本不一致,可能导致资源解析异常。
解决方法
修正主题继承:确保AppTheme继承自Material Components的基础主题,示例如下:
<style name="AppTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar"> <!-- 保留原有配置 --> <item name="materialCalendarStyle">@style/Widget.MaterialComponents.MaterialCalendar</item> <item name="materialCalendarFullscreenTheme">@style/ThemeOverlay.MaterialComponents.MaterialCalendar.Fullscreen</item> <item name="materialCalendarTheme">@style/ThemeOverlay.MaterialComponents.MaterialCalendar</item> <item name="colorSurface">#FFFFFF</item> <!-- 其他自定义主题属性 --> </style>根据需求选择对应主题,如需要ActionBar可使用
Theme.MaterialComponents.DayNight.DarkActionBar。替换为Support FragmentManager:若Activity继承自
AppCompatActivity,将getFragmentManager()替换为getSupportFragmentManager():picker.show(getSupportFragmentManager(), picker.toString());统一依赖版本:确保build.gradle中Material Components依赖使用稳定版,且与其他AndroidX依赖版本兼容,示例:
implementation 'com.google.android.material:material:1.9.0'清理重建项目:执行Android Studio中的
Clean Project和Rebuild Project操作,清除缓存资源,确保新配置生效。
内容的提问来源于stack exchange,提问作者kartheeki j
相关产品推荐
相关产品推荐

