TextInputLayout和TextInputEditText与Theme.AppCompat.Light.NoActionBar不兼容。

5
我希望在我的应用程序中使用TextInputEditTextTextInputLayout,但是如果将主题设置为Theme.AppCompat.Light.NoActionBar,它将无法正常工作。但如果将其设置为Theme.MaterialComponents.Light.NoActionBar,则可以正常工作,但这将破坏我的应用程序中所有的样式。

在XML中的用法:

<com.google.android.material.textfield.TextInputLayout
                    android:id="@+id/nameLayout"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    style="@style/reg_edit_text_style"
                    app:errorEnabled="true"
                    android:hint="@string/name">

                    <com.google.android.material.textfield.TextInputEditText
                        android:id="@+id/nameEt"
                        android:layout_width="match_parent"
                        android:nextFocusDown="@id/lastNameEt"
                        android:inputType="text"
                        style="@style/reg_edit_text_inner_style"/>

</com.google.android.material.textfield.TextInputLayout>

build.gradle 中:
implementation 'com.google.android.material:material:1.1.0-alpha07'
implementation 'androidx.appcompat:appcompat:1.0.2'

错误:

 Caused by: java.lang.IllegalArgumentException: The style on this component requires your app theme to be Theme.MaterialComponents (or a descendant).
    at com.google.android.material.internal.ThemeEnforcement.checkTheme(ThemeEnforcement.java:240)
    at com.google.android.material.internal.ThemeEnforcement.checkMaterialTheme(ThemeEnforcement.java:215)
    at com.google.android.material.internal.ThemeEnforcement.checkCompatibleTheme(ThemeEnforcement.java:143)

你试过我的答案了吗? - Vedprakash Wagh
桥主题已生效。 - martin1337
如果您正在遇到主题强制执行错误,您可以添加这些属性以继续使用当前的appcompat主题。 - Vedprakash Wagh
1个回答

3

你不能在MaterialComponents视图中使用AppCompat主题。

如果你还没有完全转换到MaterialComponents主题,你可以使用相同的桥接主题。然而,使用桥接主题不是推荐的做法。在官方文档中,他们说:

通过将应用程序主题更改为继承自 Material Components 主题来进行应用程序范围的迁移是推荐的方法。但是,在此之后务必进行彻底的测试,因为现有布局中的组件可能会改变外观和行为。

注意:如果您无法更改主题,则可以执行以下操作之一:

从我们的 Material Components Bridge 主题之一继承。有关详细信息,请参见桥接主题部分。继续从 AppCompat 主题继承并向主题添加一些新的主题属性。有关详细信息,请参见 App Compat 主题部分。

你可以在MaterialComponents主题名称前加上.Bridge来使用MaterialComponents的桥接主题。

例如:

Theme.MaterialComponents.*.Bridge

在您的情况下,应该使用Theme.MaterialComponents.Light.NoActionBar.Bridge主题。
如果您想继续使用AppCompat主题,则需要将以下几个属性添加到当前主题中,否则会抛出Theme Enforcement Error错误,这是您目前正在遇到的问题。
<item name="colorPrimaryVariant">@color/my_app_primary_variant_color</item>
  <item name="colorSecondaryVariant">@color/my_app_secondary_variant_color</item>
  <item name="colorSurface">@color/my_app_surface_color</item>
  <item name="colorOnPrimary">@color/my_app_color_on_primary</item>
  <item name="colorOnSecondary">@color/my_app_color_on_secondary</item>
  <item name="colorOnBackground">@color/my_app_color_on_background</item>
  <item name="colorOnError">@color/my_app_color_on_error</item>
  <item name="colorOnSurface">@color/my_app_color_on_surface</item>
  <item name="scrimBackground">@color/mtrl_scrim_color</item>
  <item name="textAppearanceHeadline1">@style/TextAppearance.MaterialComponents.Headline1</item>
  <item name="textAppearanceHeadline2">@style/TextAppearance.MaterialComponents.Headline2</item>
  <item name="textAppearanceHeadline3">@style/TextAppearance.MaterialComponents.Headline3</item>
  <item name="textAppearanceHeadline4">@style/TextAppearance.MaterialComponents.Headline4</item>
  <item name="textAppearanceHeadline5">@style/TextAppearance.MaterialComponents.Headline5</item>
  <item name="textAppearanceHeadline6">@style/TextAppearance.MaterialComponents.Headline6</item>
  <item name="textAppearanceSubtitle1">@style/TextAppearance.MaterialComponents.Subtitle1</item>
  <item name="textAppearanceSubtitle2">@style/TextAppearance.MaterialComponents.Subtitle2</item>
  <item name="textAppearanceBody1">@style/TextAppearance.MaterialComponents.Body1</item>
  <item name="textAppearanceBody2">@style/TextAppearance.MaterialComponents.Body2</item>
  <item name="textAppearanceCaption">@style/TextAppearance.MaterialComponents.Caption</item>
  <item name="textAppearanceButton">@style/TextAppearance.MaterialComponents.Button</item>
  <item name="textAppearanceOverline">@style/TextAppearance.MaterialComponents.Overline</item>

您需要在当前的AppCompat主题中添加这些属性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接