ThemeEnforcement错误实际上是由未设置的attrs引起的

ThemeEnforcement error actually caused by unset attrs

我收到以下 ThemeEnforcement 错误。警告。

 Caused by: android.view.InflateException: Binary XML file line #9 in com.yourproject:layout/app_bar_main: Error inflating class com.google.android.material.appbar.AppBarLayout

 Caused by: java.lang.IllegalArgumentException: The style on this component requires your app theme to be Theme.AppCompat (or a descendant).

典型的解决方案表明我没有将 Theme.AppCompat 应用于我的应用程序主题。除了我是

<style name="Theme.TestApp" parent="Theme.AppCompat">


</style>

此外,其他解决方案表明这是由于未包含适当的 material 库造成的,这些库已包含在内并且我之前能够成功编译和 运行 项目。

项目编译没有错误,但在某些情况下,应用程序会立即崩溃,但在其他情况下(我禁用了某些组件),当布局其他视图时会发生崩溃。

在后面的崩溃中,错误可能会导致标准 Button 或 TextField 膨胀。

TLDR 未设置布局中使用的自定义属性值会导致此错误。

部分问题是错误消息明确指出问题是我没有应用 Theme.AppCompat,但实际上我是。

但是我不知道的是 nav_header_main.xml 文件正在将样式 AppMenuTitle 应用到 Textfield.

此样式正在消耗名为 my.custom.attrcustom attribute。该问题是由 this attr's value had not be set in the theme 这一事实引起的。所以它基本上是空的。

<style name="AppMenuTitle" parent="ThemeOverlay.AppCompat.Dark">
    <item name="android:textColor">?my.custom.attr</item>
    <item name="android:textStyle">bold</item>
    <item name="android:textSize">18sp</item>
</style>

现在因为这些 attr 值被用在很多地方,我也遇到了膨胀你的标准的错误 Button。这真的很令人困惑,因为按钮只是竖直向上的按钮,没有直接应用样式。

相反,从应用于父容器的主题中获取样式的按钮,父容器的样式设置了 buttonStyle 属性。

这些按钮使用自定义 drawables。猜猜看,还在使用自定义属性值,猜猜看....主题中也没有设置。

确保这些自定义属性具有值,解决了错误。

<style name="Theme.TestApp" parent="Theme.AppCompat">
    <item name="my.custom.attr.used.in.textstyle">@color/black</item>
    <item name="my.custom.attr.used.in.drawable">@color/black</item>
</style>