Android:EditText 的 android:textAppearance 中忽略了 textColor。

14

当通过自定义的textAppearance样式设置textColor属性时,它被忽略的原因是什么?

<style name="EditTextAppearance" parent="@android:style/TextAppearance.Widget.EditText">
    <item name="android:fontFamily">sans-serif-medium</item>
    <item name="android:textSize">16sp</item>
    <item name="android:textColor">@color/blue</item> <!-- IGNORED -->
</style>

在 XML 中设置样式:

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textAppearance="@style/EditTextAppearance"
    />

由于某种原因,此样式不能覆盖默认主题控件颜色。

我唯一能够设置颜色的方法是在EditText中设置textColor属性(但这不是我想要的):

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textAppearance="@style/EditTextAppearance"
    android:textColor="@color/blue"
    />

请注意,为 TextView 创建的带有 textColor 的自定义 textAppearance 可以正常工作。

我尝试用 android.support.v7.widget.AppCompatEditTextandroid.support.design.widget.TextInputEditText 替换 EditText,但结果仍然相同。仍然无法正常工作。因此问题不在于 EditText 实现。

我发现了一个与此问题相同的问题 为什么 android:textAppearance 中的 textColor 被忽略?。不幸的是,没有答案。

3个回答

18

在某个地方,错误/默认值的 textColor 被捡起并应用了。您可以通过在 EditText 的 XML 中设置 android:textColor="@null" 来强制使用您在 android:textAppearance 中定义的 android:textColor


我没想到解决方案可以这么简单。谢谢! - matoni
2
这件令人沮丧的事情是,你必须始终记得添加android:textColor="@null"。 - Aba

1
EditTextandroid:textAppearance中忽略了android:textColor,因为android:editTextColor属性总是会覆盖EditText的文本颜色(不要问我为什么,这与疯狂的Android有关)。但如果您将此属性添加到主题中,则一切正常。
<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
     <item name="android:editTextColor">@null</item>
</style>

0

仍然不知道为什么当按照问题描述创建样式时,textAppearance会忽略textColor,但我认为我已经找到了另一种设置textColor样式的方法,所以可能会对某些人有用。

我在尝试设置editTextColor属性时玩了一下EditText颜色,出乎意料地成功了:

<!-- consider to extend application theme over default "Base.V7.Widget.AppCompat.EditText" to achieve consistent look and feel -->
<style name="EditTextTheme" parent="Base.V7.Widget.AppCompat.EditText">
    <item name="colorControlNormal">@color...</item>    <!-- underline color -->
    <item name="colorControlActivated">@color...</item> <!-- underline color on focus -->
    <item name="editTextColor">@color/blue</item> <!-- ACCEPTED -->
</style>

设置主题:

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textAppearance="@style/EditTextAppearance"
    android:theme="@style/EditTextTheme"
    />

此时您拥有自定义的"@style/EditTextAppearance""@style/EditTextTheme"。好消息是,您可以将"@style/EditTextAppearance""@style/EditTextTheme"进行合并,方法如下:

<style name="EditTextTheme" parent="Base.V7.Widget.AppCompat.EditText">
    ...
    <item name="editTextColor">@color/blue</item>
    <item name="editTextStyle">@style/EditTextAppearance</item>
</style>

这样,您只需在EditText中设置主题即可:

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/EditTextTheme"
    />

目前的解决方案已经非常完美,但如果能够在textAppearance样式中设置textColor属性,那就更好了。因此,我尝试从主题中删除editTextColor并将其替换为在textAppearance样式@style/EditTextAppearance中设置的textColor属性。

<style name="EditTextAppearance" parent="@android:style/TextAppearance.Widget.EditText">
    <item name="android:fontFamily">sans-serif-medium</item>
    <item name="android:textSize">16sp</item>
    <item name="android:textColor">@color/blue</item> <!-- APPLIED if appearance is part of the theme -->
</style>

<style name="EditTextTheme" parent="Base.V7.Widget.AppCompat.EditText">
    <item name="colorControlNormal">@color...</item>
    <item name="colorControlActivated">@color...</item>
    <item name="editTextStyle">@style/EditTextAppearance</item>
</style>

这样textColor包含在textAppearance中最终被应用!


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