Does my theme extend from Theme.MaterialComponents
? Oh yes indeed, and has been since I started using any of the new Material UI stuff.
If all these answers here are as unhelpful to you as they were to me, get ready: The This component requires that you specify a valid android:textAppearance attribute
error can be related to an external library specifying android:theme
with the same name as the theme you are using, and Android randomly deciding which one to use depending on your build.gradle. In my case the culprit was inside Mobile FFmpeg.
I started encountering this error after working for a week while the build variant was set to a different product flavor and then switching back the original one. What changed meanwhile? After thorough investigation I found the build broke after I split implementation 'com.arthenica:mobile-ffmpeg-min:4.2.2.LTS'
in two, for each product flavor where I actually use it like this:
videoImplementation 'com.arthenica:mobile-ffmpeg-min:4.2.2.LTS'
mainImplementation 'com.arthenica:mobile-ffmpeg-min:4.2.2.LTS'
This was enough to trigger This component requires that you specify a valid android:textAppearance attribute
for flavor main
, while working fine for flavor video
. Every main
build crashed because my app's theme is named AppTheme
and the Mobile FFmpeg manifest also specifies android:theme="@style/AppTheme"
(which affects all versions up to 4.2.2). So I renamed my theme, but that resulted in a build error very similar to the one here:
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.
After adding said tools:replace="android:theme"
, everything worked again, and the original MaterialComponents error was gone.
But why is it OK for one flavor and not OK for the other? Absolutely no idea. Credit goes to Google's tendency to add the craziest bugs to "stable" releases. At least it's possible to solve very easily with some refactoring.
TL;DR
THIS is the issue: https://github.com/tanersener/mobile-ffmpeg/issues/206
Together with the fact that when two merged manifest specify different themes with the same name, Android will choose one randomly depending on the content of your build.gradle
.
Solution: Add a tools:replace="android:theme"
to your manifest's <application>
tag and change the name of your theme.