【问题标题】:TextInputLayout and TextInputEditText doesnt work with Theme.AppCompat.Light.NoActionBarTextInputLayout 和 TextInputEditText 不适用于 Theme.AppCompat.Light.NoActionBar
【发布时间】:2019-10-22 00:24:20
【问题描述】:

我想在我的应用程序中使用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)

【问题讨论】:

  • 你试过我的答案了吗?
  • 桥主题工作
  • 如果你想继续使用当前的 appcompat 主题,你也可以添加这些属性,因为你会遇到主题强制错误..

标签: android android-layout android-textinputlayout


【解决方案1】:

您不能将AppCompat 主题与MaterialComponents 视图一起使用。

如果您还没有准备好完全转移到MaterialComponents 主题,您可以使用相同的桥主题。虽然,不推荐使用 Bridge 主题。在他们的官方文档中,他们说:

通过将应用主题更改为继承自来进行应用范围的迁移 材料组件主题是推荐的方法。然而,成为 确保在之后彻底测试,作为现有布局中的组件 可能会改变他们的外表和行为。

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

继承自我们的 Material Components Bridge 主题之一。见 桥主题部分了解更多详细信息。继续继承 AppCompat 主题并为您的主题添加一些新的主题属性。看 有关更多详细信息,请参阅 App Compat Themes 部分。

您可以通过在MaterialComponents 主题名称前添加.Bridge 来使用MaterialComponents 的Bridge 主题。

例如。

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 主题中添加这些属性。

【讨论】:

    猜你喜欢
    • 2016-10-16
    • 2019-02-09
    • 2020-09-28
    • 2017-04-18
    • 1970-01-01
    • 2018-03-15
    • 1970-01-01
    • 2018-10-13
    • 1970-01-01
    相关资源
    最近更新 更多