android.support.design.button.MaterialButton бросает InflateException

Я пытаюсь использовать кодовую метку MDC на 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'
   })

...

Трассировки стека

    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 и выяснил, что проблема была в том, что тема приложения должна быть унаследована от Theme.MaterialComponents.

Ответы

Ответ 1

Убедитесь, что стиль темы приложения унаследован от 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 вместо смены тем.

Более подробную информацию можно найти (5) Компоненты материального дизайна (Android Dev Summit '18) - YouTube в 3:25 мин.

Ответ 4

Ошибка также может возникать при использовании любых версий Материальных компонентов, начиная с 1.0.0 и выше, вызванных конфликтом имен тем из-за тем, указанных во внешних библиотеках, таких как Mobile FFmpeg. В этом случае вам нужно изменить название своей темы. Для получения дополнительной информации я объясню это более подробно в ответе на подобный вопрос: fooobar.com/info/15855550/...

В основном, если вы столкнулись с этой проблемой, но знаете, что вы правильно используете тему MaterialComponents, выполните поиск в Android Studio для вашей темы приложения, используя "Найти в пути" → "Область" → "Все места". Например, после создания и запуска приложения, если имя вашей темы - AppTheme, найдите "AppTheme", включая кавычки, чтобы увидеть, существует ли кэшированный файл XML, в котором указано точно такое же имя.