web-dev-qa-db-ja.com

java.lang.IllegalArgumentException:このコンポーネントでは、有効なAndroid:textAppearance属性を指定する必要があります

レイアウトファイルの1つにcom.google.Android.material.button.MaterialButtonコンポーネントがあり、Material Componentsライブラリの最新バージョン(com.google.Android.material:material:1.0を使用しているときにこのエラーが発生します。 .0-alpha3):

Java.lang.IllegalArgumentException:このコンポーネントでは、有効なAndroid:textAppearance属性を指定する必要があります。

1.0.0-alpha1には存在しませんでした。これはライブラリのバグですか、または今からtextAppearance属性を指定するだけですか?

28
Roland Szép

テーマはTheme.MaterialComponentsから拡張されていますか?すべてのコンポーネントが正常に動作することを確認する方法の詳細については、 https://material.io/develop/Android/docs/getting-started/ を参照してください。

44
Cameron Ketcham

MaterialComponentのいずれかを使用している場合、テーマはテーマ "Theme.MaterialComponents.Light.DarkActionBar"から拡張する必要があります

 <style name="AppTheme" parent="Theme.MaterialComponents.Light.DarkActionBar">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>
25
sodiqOladeni

古いスタイルを使い続けたいが、「Theme.MaterialComponents」からのみ拡張したい場合は、「Bridge」を使用できます。

<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorAccent</item>
        <item name="colorAccent">@color/colorPrimaryDark</item>
</style>
2
Akshay Gaonkar

AppThemeがMaterialComponentsから指定されたとおりに継承するかどうかを確認します here

<style name="Theme.MyApp" parent="Theme.MaterialComponents.Light">
    <!-- ... -->
</style>

Styles.xmlファイルのすべてのバリアントを必ず確認してください。これは実際に私が抱えていた問題でした。

1
an1s1a

テーマはTheme.MaterialComponentsから拡張されますか?ええ、確かに、新しいマテリアルUIを使用し始めてからです。ここでのこれらの回答がすべて私にとって役に立たない場合は、準備をしてください:This component requires that you specify a valid Android:textAppearance attributeエラーは、Android:themeを指定する外部ライブラリに関連している可能性があります使用しているテーマと同じ名前、およびAndroidは、build.gradleに応じて、使用するテーマをランダムに決定します。私の場合、犯人は Mobile FFmpeg の中にいました。

ビルドバリアントが別の製品フレーバーに設定されてから1週間働いた後、このエラーが発生し始め、元のバージョンに切り替えました。その間に何が変わりましたか?徹底的な調査の結果、implementation 'com.arthenica:mobile-ffmpeg-min:4.2.2.LTS'を2つに分割した後、実際に使用する製品フレーバーごとにビルドが壊れていることがわかりました。

videoImplementation 'com.arthenica:mobile-ffmpeg-min:4.2.2.LTS'
mainImplementation 'com.arthenica:mobile-ffmpeg-min:4.2.2.LTS'

これは、フレーバーmainに対して正常に動作しながら、フレーバーvideoに対してThis component requires that you specify a valid Android:textAppearance attributeをトリガーするのに十分でした。アプリのテーマの名前がmainであり、モバイルFFmpegマニフェストでもAndroid:theme="@style/AppTheme"(4.2.2までのすべてのバージョンに影響する)が指定されているため、すべてのAppThemeビルドがクラッシュしました。そのため、テーマの名前を変更しましたが、その結果、次のようなビルドエラーが発生しました。 https://github.com/tanersener/mobile-ffmpeg/issues/206

    Attribute application@theme value=(@style/ScryptedTheme) from AndroidManifest.xml:37:9-45
    is also present at [com.arthenica:mobile-ffmpeg-https:4.2.LTS] AndroidManifest.xml:17:9-40 value=(@style/AppTheme).
    Suggestion: add 'tools:replace="Android:theme"' to <application> element at AndroidManifest.xml:31:5-95:19 to override.

上記のtools:replace="Android:theme"を追加した後、すべてが再び機能し、元のMaterialComponentsエラーはなくなりました。

しかし、なぜ一方のフレーバーでは問題なく、もう一方のフレーバーでは問題ないのでしょうか?まったくわからない。信用は、「安定した」リリースに最もクレイジーなバグを追加するGoogleの傾向にあります。少なくとも、リファクタリングを行うことで非常に簡単に解決できます。

TL; DR

これが問題です: https://github.com/tanersener/mobile-ffmpeg/issues/206 2つのマージされたマニフェストが同じ名前の異なるテーマを指定するという事実とともに、Androidは、build.gradleのコンテンツに応じてランダムに1つを選択します。

解決策:tools:replace="Android:theme"をマニフェストの<application>タグに追加し、テーマの名前を変更します

1
0101100101

テーマがTheme.MaterialComponentsを拡張している場合でも、このエラーが発生します。このようなチップを作成していました:Chip chip = new Chip(getActivity().getBasecontext(), null, R.attr.CustomChipChoice);

解決策は、それをChip chip = new Chip(getActivity(), null, R.attr.CustomChipChoice);に変更することです。

それが役に立てば幸い。

0
Diridou

同じ問題があり、アクティビティのテーマを変更しましたが、問題は解決しませんでした。メインアプリのテーマをAppCompactからTheme.MaterialComponentsに変更しました

<application
    Android:allowBackup="true"
    Android:fullBackupContent="true"
    Android:icon="@mipmap/ic_launcher"
    Android:label="@string/app_name"
    Android:supportsRtl="true"
    Android:theme="@style/AppTheme2">
<activity
        Android:name=".MainActivity"
        Android:label="@string/app_name"/>
</application>
0
KhanStan99