codelabs.developers.google.comのMDC Codelab に従って最新のライブラリバージョンを使用しようとしています。 EditText-Android.support.design.widget.TextInputEditText
は期待どおりに動作するようですが、Android.support.design.button.MaterialButtonを使用すると、ランタイムInflateExceptionがスローされます。
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から継承する必要があるという事実に問題があることを理解しました。
App ThemeスタイルがTheme.MaterialComponents
から継承されていることを確認します
例:
<style name="XXXXXAppTheme" parent="@style/Theme.MaterialComponents.Light.DarkActionBar">
アプリ全体のテーマを(まだ)変更できない場合は、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" />
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
Mobile FFmpeg などの外部ライブラリで指定されたテーマによるテーマの名前の競合が原因で、1.0.0から最新までのマテリアルコンポーネントバージョンを使用する場合にもエラーが発生する場合があります。この場合、独自のテーマの名前を変更する必要があります。詳細については、この同様の質問への回答でこれをより詳細に説明します。 https://stackoverflow.com/a/57565773/2964379
基本的にこの問題が発生したが、MaterialComponentsテーマを正しく使用していることがわかっている場合は、Android Studioで「パスを検索」->「スコープ」->「すべての場所」を使用してアプリテーマを検索します「。たとえば、アプリをビルドして実行した後、テーマ名がAppTheme
である場合、引用符を含む"AppTheme"
を検索して、まったく同じ名前を指定するキャッシュされたXMLファイルがあるかどうかを確認します。