レイアウトファイルの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属性を指定するだけですか?
テーマはTheme.MaterialComponents
から拡張されていますか?すべてのコンポーネントが正常に動作することを確認する方法の詳細については、 https://material.io/develop/Android/docs/getting-started/ を参照してください。
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>
古いスタイルを使い続けたいが、「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>
AppThemeがMaterialComponentsから指定されたとおりに継承するかどうかを確認します here 。
<style name="Theme.MyApp" parent="Theme.MaterialComponents.Light">
<!-- ... -->
</style>
Styles.xmlファイルのすべてのバリアントを必ず確認してください。これは実際に私が抱えていた問題でした。
テーマは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>
タグに追加し、テーマの名前を変更します。
テーマがTheme.MaterialComponents
を拡張している場合でも、このエラーが発生します。このようなチップを作成していました:Chip chip = new Chip(getActivity().getBasecontext(), null, R.attr.CustomChipChoice);
。
解決策は、それをChip chip = new Chip(getActivity(), null, R.attr.CustomChipChoice);
に変更することです。
それが役に立てば幸い。
同じ問題があり、アクティビティのテーマを変更しましたが、問題は解決しませんでした。メインアプリのテーマを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>