TextInputLayout Material 组件问题:此组件的样式要求您的应用主题为 Theme.MaterialComponents(或后代)
TextInputLayout Material Component Issue : The style on this component requires your app theme to be Theme.MaterialComponents (or a descendant)
我在使用 TextInputLayout 实现 Material 设计时遇到问题,我知道解决方案是让您的 activity 主题继承 Material 组件主题之一,但这会带来这样的问题我的大部分应用程序主题都发生了变化,需要更多时间来重构它。我想要的是 Material 只为应用程序上的这个特定 TextInputLayout 设计。
这是我试过的
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/firstName"
style="@style/CustomInputStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginEnd="5dp"
android:layout_weight="1"
app:errorEnabled="true">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/fname"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/first_name"
android:inputType="text|textCapWords"
android:nextFocusDown="@id/lname"
android:textSize="12sp" />
</com.google.android.material.textfield.TextInputLayout>
<style name="CustomInputStyle" parent="Widget.MaterialComponents.TextInputLayout.OutlinedBox">
<item name="boxStrokeWidth">2dp</item>
<item name="hintTextColor">@color/colorAccent</item>
<item name="boxStrokeColor">@android:color/white</item>
<item name="android:colorAccent">@color/colorAccent</item>
<item name="android:textColorHint">@color/colorAccent</item>
</style>
错误: Caused by: java.lang.IllegalArgumentException: The style on this component requires your app theme to be Theme.MaterialComponents (or a descendant).
我们不能只这样做而不是覆盖整个 app/activity 主题吗?我只想在特定的片段中使用它。
我只是注意到可以将 Material Components 主题放在 XML 布局的根视图中,然后您现在可以毫无错误地应用样式。
在 parent/root 视图中添加这个
android:theme="@style/Theme.MaterialComponents.Bridge"
然后将样式应用于子视图 TextInputLayout
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/firstName"
style="@style/CustomInputStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginEnd="5dp"
android:layout_weight="1"
app:errorEnabled="true">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/fname"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/first_name"
android:inputType="text|textCapWords"
android:nextFocusDown="@id/lname"
style="@style/CustomEditText"
android:textSize="12sp" />
</com.google.android.material.textfield.TextInputLayout>
问题:如果您想对“TextInputLayout”应用错误的样式,有时会出现这种情况。
例如:在我的例子中,我尝试使用“TextInputLayout”作为下拉列表
所以在“TextInputLayout”里面我放了“AutoCompleteTextView”,在最后一个里面我确定了样式 style="@style/Widget.Material3.TextInputLayout.OutlinedBox.ExposedDropdownMenu" 所以它给了我上面的错误。
解决:把样式改成正确的。
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.Dense.ExposedDropdownMenu"
现在可以使用了,应用 运行 正确。
之前:
style="@style/Widget.Material3.TextInputLayout.OutlinedBox.ExposedDropdownMenu"
之后:
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.Dense.ExposedDropdownMenu"
我有同样的问题,但是当我将暴露的下拉样式从 material3 组件更改为 material 组件时,崩溃仍然存在,但现在使用其他 material3 组件,例如新组件Material带有
的按钮
<com.google.android.material.button.MaterialButton
此外,我的基本主题需要继承 material2(Material 组件)而不是 material3 ...
22 年 5 月 12 日更新
我已经尝试过你的桥接版本,但现在它因另一个错误而崩溃。在纪录片中,一个暴露的下拉菜单 (m3) 需要一个锚点,但在您的桥中它会崩溃,因为它不能使用锚点属性。
我通过检查所有组件并将其更改为 material 3 或 legacy/appcompat 组件解决了所有问题。我直接在 XML 布局中设置了 textinputlayout 的样式,现在我可以构建和启动我的应用程序而不会崩溃。如果需要,我可以提供代码示例 ;)
我在使用 TextInputLayout 实现 Material 设计时遇到问题,我知道解决方案是让您的 activity 主题继承 Material 组件主题之一,但这会带来这样的问题我的大部分应用程序主题都发生了变化,需要更多时间来重构它。我想要的是 Material 只为应用程序上的这个特定 TextInputLayout 设计。
这是我试过的
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/firstName"
style="@style/CustomInputStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginEnd="5dp"
android:layout_weight="1"
app:errorEnabled="true">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/fname"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/first_name"
android:inputType="text|textCapWords"
android:nextFocusDown="@id/lname"
android:textSize="12sp" />
</com.google.android.material.textfield.TextInputLayout>
<style name="CustomInputStyle" parent="Widget.MaterialComponents.TextInputLayout.OutlinedBox">
<item name="boxStrokeWidth">2dp</item>
<item name="hintTextColor">@color/colorAccent</item>
<item name="boxStrokeColor">@android:color/white</item>
<item name="android:colorAccent">@color/colorAccent</item>
<item name="android:textColorHint">@color/colorAccent</item>
</style>
错误: Caused by: java.lang.IllegalArgumentException: The style on this component requires your app theme to be Theme.MaterialComponents (or a descendant).
我们不能只这样做而不是覆盖整个 app/activity 主题吗?我只想在特定的片段中使用它。
我只是注意到可以将 Material Components 主题放在 XML 布局的根视图中,然后您现在可以毫无错误地应用样式。
在 parent/root 视图中添加这个
android:theme="@style/Theme.MaterialComponents.Bridge"
然后将样式应用于子视图 TextInputLayout
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/firstName"
style="@style/CustomInputStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginEnd="5dp"
android:layout_weight="1"
app:errorEnabled="true">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/fname"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/first_name"
android:inputType="text|textCapWords"
android:nextFocusDown="@id/lname"
style="@style/CustomEditText"
android:textSize="12sp" />
</com.google.android.material.textfield.TextInputLayout>
问题:如果您想对“TextInputLayout”应用错误的样式,有时会出现这种情况。
例如:在我的例子中,我尝试使用“TextInputLayout”作为下拉列表 所以在“TextInputLayout”里面我放了“AutoCompleteTextView”,在最后一个里面我确定了样式 style="@style/Widget.Material3.TextInputLayout.OutlinedBox.ExposedDropdownMenu" 所以它给了我上面的错误。
解决:把样式改成正确的。 style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.Dense.ExposedDropdownMenu" 现在可以使用了,应用 运行 正确。
之前:
style="@style/Widget.Material3.TextInputLayout.OutlinedBox.ExposedDropdownMenu"
之后: style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.Dense.ExposedDropdownMenu"
我有同样的问题,但是当我将暴露的下拉样式从 material3 组件更改为 material 组件时,崩溃仍然存在,但现在使用其他 material3 组件,例如新组件Material带有
的按钮<com.google.android.material.button.MaterialButton
此外,我的基本主题需要继承 material2(Material 组件)而不是 material3 ...
22 年 5 月 12 日更新
我已经尝试过你的桥接版本,但现在它因另一个错误而崩溃。在纪录片中,一个暴露的下拉菜单 (m3) 需要一个锚点,但在您的桥中它会崩溃,因为它不能使用锚点属性。
我通过检查所有组件并将其更改为 material 3 或 legacy/appcompat 组件解决了所有问题。我直接在 XML 布局中设置了 textinputlayout 的样式,现在我可以构建和启动我的应用程序而不会崩溃。如果需要,我可以提供代码示例 ;)