android.support.design.button.MaterialButton引发InflateException

时间:2018-08-14 12:28:39

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

我正在尝试遵循The MDC Codelab on codelabs.developers.google.com的最新库版本。 EditText -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'
   })

...

StackTrace

    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)

编辑: 在stacktrace中添加了更多详细信息,并发现问题是与App主题需要从Theme.MaterialComponents继承而来的。

5 个答案:

答案 0 :(得分:37)

确保应用主题样式继承自div.item{ display: none; } div.item.shown-items{ display: flex; }

示例:

Theme.MaterialComponents

答案 1 :(得分: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" />

答案 2 :(得分:1)

除了添加Theme.MaterialComponents

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

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

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

答案 3 :(得分:0)

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

基本上,如果遇到此问题,但知道您正确使用了MaterialComponents主题,请在Android Studio中使用“查找路径”->“范围”->“所有位置”来搜索您的应用主题。例如,在构建并运行您的应用之后,如果您的主题名称为AppTheme,请搜索"AppTheme"(包括引号)以查看是否存在指定了完全相同名称的缓存XML文件。

答案 4 :(得分:0)

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

<块引用>

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