【问题标题】:android.support.design.button.MaterialButton throws InflateExceptionandroid.support.design.button.MaterialButton 抛出 InflateException
【发布时间】:2018-08-14 12:28:38
【问题描述】:

我正在尝试使用最新的库版本关注The MDC Codelab on codelabs.developers.google.comEditText -android.support.design.widget.TextInputEditText 似乎可以按预期工作,但是在使用 android.support.design.button.MaterialButton 时会引发运行时 InflateException。

Gradle 配置:

compileSdkVersion 28

minSdkVersion 21

targetSdkVersion 28

dependencies {
   def lifecycle_version = "1.1.1"
   def nav_version = "1.0.0-alpha05"
   def work_version = "1.0.0-alpha06"
   def supportLibraryVersion = "28.0.0-rc01"

   implementation fileTree(include: ['*.jar'], dir: 'libs')
   api "android.arch.lifecycle:extensions:$lifecycle_version"
   api "android.arch.lifecycle:common-java8:$lifecycle_version"
   api "android.arch.navigation:navigation-fragment:$nav_version"
   api "android.arch.navigation:navigation-ui:$nav_version"
   api "android.arch.work:work-runtime:$work_version"

   api ("com.android.support:appcompat-v7:$supportLibraryVersion", {
       exclude group: 'com.android.support', module: 'support-media-compat'
   })
   api ("com.android.support:design:$supportLibraryVersion", {
       exclude group: 'com.android.support', module: 'support-media-compat'
   })
   api ("com.android.support:cardview-v7:$supportLibraryVersion", {
       exclude group: 'com.android.support', module: 'support-media-compat'
   })
   api ("com.android.support:customtabs:$supportLibraryVersion", {
       exclude group: 'com.android.support', module: 'support-media-compat'
   })

...

堆栈跟踪

    E/XXXXXXApp: Unhandled Exception - Application Crash
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.XXXXXX/com.XXXXXX.activities.XXXXXXActivity}: android.view.InflateException: Binary XML file line #84: Binary XML file line #84: Error inflating class android.support.design.button.MaterialButton
    at com.XXXXXXActivity.onCreate(LoginActivity.java:107)
...

 Caused by: java.lang.IllegalArgumentException: This component requires that you specify a valid TextAppearance attribute. Update your app theme to inherit from Theme.MaterialComponents (or a descendant).
                 at android.support.design.internal.ThemeEnforcement.checkTextAppearance(ThemeEnforcement.java:170)
                 at android.support.design.internal.ThemeEnforcement.obtainStyledAttributes(ThemeEnforcement.java:75)
                 at android.support.design.button.MaterialButton.<init>(MaterialButton.java:140)
                 at android.support.design.button.MaterialButton.<init>(MaterialButton.java:133)

编辑: 向堆栈跟踪添加了更多详细信息,并发现问题与 App Theme 需要从 Theme.MaterialComponents 继承这一事实有关。

【问题讨论】:

标签: android android-gradle-plugin material-design android-design-library


【解决方案1】:

确保 App Theme 样式继承自 Theme.MaterialComponents

例子:

<style name="XXXXXAppTheme" parent="@style/Theme.MaterialComponents.Light.DarkActionBar"> 

【讨论】:

【解决方案2】:

如果您(还)不能更改整个应用的主题,您也可以只为 this 视图更改主题:

<com.google.android.material.button.MaterialButton
    android:id="@+id/fooButon"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_margin="16dp"
    android:fontFamily="sans-serif"
    android:padding="8dp"
==> android:theme="@style/Theme.MaterialComponents.Light"
    app:backgroundTint="@color/base_white" />

【讨论】:

    【解决方案3】:

    除了添加 Theme.MaterialComponents

    1)如果您只想获取属性而不是默认样式,也可以添加 Theme.MaterialComponents.Bridge

    2)添加 androidx 和 com.google.android.material 库而不是更改主题。

    更多信息可以在 3:25 分钟 (5) The Components of Material Design (Android Dev Summit '18) - YouTube 找到

    【讨论】:

    • 这些选项都没有为我解决问题,而 Ciprian 的回答确实解决了这个问题:将主题直接应用于组件。
    【解决方案4】:

    在使用从 1.0.0 到最新的任何 Material Components 版本时也可能出现此错误,这是由于外部库中指定的主题(例如 Mobile FFmpeg)引起的主题命名冲突引起的。在这种情况下,您需要更改自己主题的名称。有关更多信息,我会在回答类似问题时更详细地解释这一点:https://stackoverflow.com/a/57565773/2964379

    基本上,如果您遇到此问题,但知道您正确使用了 MaterialComponents 主题,请使用“Find in Path”->“Scope”->“All Places”在 Android Studio 中搜索您的应用主题。例如,在构建并运行您的应用后,如果您的主题名称为 AppTheme,则搜索 "AppTheme"(包括引号)以查看是否存在指定完全相同名称的缓存 XML 文件。

    【讨论】:

      【解决方案5】:

      如果您不想更改应用的整个主题并回答否。 2 使您的按钮消失,然后我建议将其添加到您的 MaterialButton

      android:theme="@style/Theme.MaterialComponents.NoActionBar"

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-02-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-17
        • 2019-01-28
        • 2020-01-05
        相关资源
        最近更新 更多