java.lang.IllegalArgumentException:此组件要求您指定有效的android:textAppearance属性

时间:2018-06-12 16:03:19

标签: android material-components material-components-android

我的一个布局文件中有一个com.google.android.material.button.MaterialButton组件,当我使用最新版本的Material Components库时,我收到此错误(com.google.android.material:材料:1.0.0-素α3):

java.lang.IllegalArgumentException:此组件要求您指定有效的android:textAppearance属性。

它不存在于1.0.0-alpha1中。这是库中的错误还是我现在应该只指定textAppearance属性?

10 个答案:

答案 0 :(得分:34)

您的主题是否从Theme.MaterialComponents延伸?有关如何确保所有组件正常工作的详细信息,请访问https://material.io/develop/android/docs/getting-started/

答案 1 :(得分:19)

如果您使用任何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>

答案 2 :(得分:14)

如果您想继续使用旧样式,而只想从'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>

答案 3 :(得分:4)

如果您的主题没有扩展MaterialComponents主题,并且您想要保留AppCompat主题,请使用过渡主题,该主题将允许您使用保留AppCompat主题的材质组件。

从以下位置更改现有主题:

 <style name="AppTheme" parent="Theme.AppCompat.Light">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>

对此:

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

答案 4 :(得分:1)

我的主题从Theme.MaterialComponents开始吗?哦,的确如此,自从我开始使用任何新的Material UI东西以来,就一直如此。 如果此处所有这些答案对您都没有帮助,请做好准备:This component requires that you specify a valid android:textAppearance attribute错误可能与指定android:theme与您的主题同名的外部库有关正在使用,Android会根据您的build.gradle 来随机决定使用哪个。就我而言,罪魁祸首在Mobile FFmpeg内部。

在将构建变型设置为不同的产品风味然后又切换回原始版本的工作一周后,我开始遇到此错误。同时发生了什么变化?经过彻底的调查,我发现将implementation 'com.arthenica:mobile-ffmpeg-min:4.2.2.LTS'一分为二后,对于每种产品口味(实际上我是这样使用的),构建就破裂了:

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

这足以触发This component requires that you specify a valid android:textAppearance attribute的口味main,同时又能很好地处理口味video。每个main构建都会崩溃,因为我的应用程序的主题名为AppTheme,并且移动FFmpeg清单还指定了android:theme="@style/AppTheme"(影响到4.2.2以下的所有版本)。因此,我重命名了主题,但这导致了一个生成错误,与此处的错误非常相似: 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 当两个合并的清单以相同的名称指定不同的主题时,Android会根据您的build.gradle的内容随机选择一个主题。

解决方案:在清单的tools:replace="android:theme"标签中添加<application>,并更改主题名称

答案 5 :(得分:1)

即使我的主题扩展了Theme.MaterialComponents,该错误仍然存​​在。我正在创建像这样的芯片:Chip chip = new Chip(getActivity().getBasecontext(), null, R.attr.CustomChipChoice);

解决方案是将其更改为Chip chip = new Chip(getActivity(), null, R.attr.CustomChipChoice);

希望有帮助。

答案 6 :(得分:0)

我遇到了同样的问题,我更改了活动主题,但未能解决问题。我将主应用程序主题从AppCompact更改为Theme.MaterialComponents

public static string DoSomething(this int input, ...) => DoSomethingHelper(input, ...);
public static string DoSomething(this decimal input, ...) => DoSomethingHelper(input, ...);
public static string DoSomething(this double input, ...) => DoSomethingHelper(input, ...);
public static string DoSomething(this string input, ...) => DoSomethingHelper(input, ...);

private static string DoSomethingHelper<T>(this T input, ....)
{
    // complex logic
}

答案 7 :(得分:0)

检查您的AppTheme是否从here指定的MaterialComponents继承。

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

请记住检查styles.xml文件的所有变体。这实际上是我遇到的问题。

答案 8 :(得分:0)

我首先包括了这种依赖性

implementation 'com.google.android.material:material:1.2.0-alpha01'

比我将项目样式设置为波纹管

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

答案 9 :(得分:0)

正确扩展? => 验证您的风格!

就我而言,我犯了一个愚蠢的自动完成错误:

<item name="textInputStyle">@style/Widget.MaterialComponents.Button.OutlinedButton</item>

我真正的意思是 TextInputLayout.OutlinedBox 而不是 Button.OutlinedButton

<item name="textInputStyle">@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox</item>

不幸的是,这个错字给出了同样的误导性错误(尽管正确扩展了主题):

<块引用>

Caused by: java.lang.IllegalArgumentException: 此组件需要 您指定了有效的 TextAppearance 属性。更新您的应用 从 Theme.MaterialComponents(或后代)继承的主题。

...分享,因为我花了很长时间才发现错误!