web-dev-qa-db-ja.com

android.support.design.button.MaterialButtonはInflateExceptionをスローします

codelabs.developers.google.comのMDC Codelab に従って最新のライブラリバージョンを使用しようとしています。 EditText-Android.support.design.widget.TextInputEditTextは期待どおりに動作するようですが、Android.support.design.button.MaterialButtonを使用すると、ランタイムInflateExceptionがスローされます。

Gradle config:

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)

EDIT:詳細をスタックトレースに追加し、App ThemeをTheme.MaterialComponentsから継承する必要があるという事実に問題があることを理解しました。

17
Nabster

App ThemeスタイルがTheme.MaterialComponentsから継承されていることを確認します

例:

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

アプリ全体のテーマを(まだ)変更できない場合は、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" />
15
Ciprian

Theme.MaterialComponentsの追加とは別に

1)デフォルトのスタイルではなく属性のみを取得したい場合は、Theme.MaterialComponents.Bridgeを追加することもできます

2)テーマを変更する代わりに、androidxおよびcom.google.Android.materialライブラリを追加します。

詳細はこちらをご覧ください (5)The Components of Material Design(Android Dev Summit '18)-YouTube at 3:25 min

1
Apoorva Jain

Mobile FFmpeg などの外部ライブラリで指定されたテーマによるテーマの名前の競合が原因で、1.0.0から最新までのマテリアルコンポーネントバージョンを使用する場合にもエラーが発生する場合があります。この場合、独自のテーマの名前を変更する必要があります。詳細については、この同様の質問への回答でこれをより詳細に説明します。 https://stackoverflow.com/a/57565773/2964379

基本的にこの問題が発生したが、MaterialComponentsテーマを正しく使用していることがわかっている場合は、Android St​​udioで「パスを検索」->「スコープ」->「すべての場所」を使用してアプリテーマを検索します「。たとえば、アプリをビルドして実行した後、テーマ名がAppThemeである場合、引用符を含む"AppTheme"を検索して、まったく同じ名前を指定するキャッシュされたXMLファイルがあるかどうかを確認します。

0
0101100101