安卓支持设计按钮MaterialButton引发InflateException异常

24

我试图使用最新的库版本遵循Google开发者网站上的MDC Codelab教程

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'
   })

...

堆栈跟踪

    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)

编辑: 在堆栈跟踪中添加了更多细节,并发现问题与应用程序主题需要从Theme.MaterialComponents继承有关。


请发布您的完整崩溃日志和XML。 - prashant17
@prashant17添加了更多的细节,并找到了解决方案。谢谢。 - Nabster
https://stackoverflow.com/a/56822378/7254873 - Sumit Shukla
5个回答

59

确保应用程序主题风格从Theme.MaterialComponents继承。

示例:

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

2
这些错误的更多信息可以在入门指南中找到:https://material.io/develop/android/docs/getting-started/ - Cameron Ketcham
这很难做到 - 我正在使用DayNight主题 - Someone Somewhere

33

如果你还不能更改整个应用的主题,你也可以仅为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" />

1

这些选项都没有解决我的问题,而Ciprian的答案确实解决了这个选项:直接将主题应用到组件上。 - straya

1
错误也可能发生在使用从1.0.0到最新的任何Material Components版本时,由于在外部库中指定的主题引起的主题命名冲突,例如Mobile FFmpeg。在这种情况下,您需要更改自己主题的名称。有关详细信息,请参见我在类似问题的答案中更详细地解释:https://dev59.com/c1UL5IYBdhLWcg3wHU_M#57565773 基本上,如果您遇到此问题,但知道您正在正确使用MaterialComponents主题,请在Android Studio中使用“查找路径”->“范围”->“所有位置”搜索您的应用程序主题。例如,在构建和运行应用程序后,如果您的主题名称为AppTheme,请搜索"AppTheme"(包括引号),以查看是否存在缓存的XML文件,指定完全相同的名称。

0
如果您不想更改应用程序的整个主题并且第二种方法使您的按钮消失,那么我建议将此添加到您的MaterialButton。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接