Android:textColor在android中忽略:textTeppearance的EditText

时间:2017-07-19 16:34:39

标签: android android-styles

textColor属性通过自定义textAppearance样式设置时,是否有任何理由被忽略?

<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"
    />

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

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

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

注意,为textAppearance创建textColor的自定义TextView可以正常运行。

我尝试将EditText替换为android.support.v7.widget.AppCompatEditTextandroid.support.design.widget.TextInputEditText,但结果是相同的。还是行不通。所以问题不在EditText实施中。

我发现了同样问题的问题Why is textColor in android:textAppearance ignored?。不幸的是,没有回答。

3 个答案:

答案 0 :(得分:10)

沿线的某处,正在拾取并应用textColor的错误/默认值。您可以通过在android:textColor的XML中设置android:textAppearance来强制使用您在android:textColor="@null"中定义的EditText

答案 1 :(得分:0)

仍然不知道为什么textAppearance在创建样式时会忽略textColor,但我认为我已找到另一种方式如何通过样式设置textColor,所以有人可能觉得它很有用。

我正在使用EditText颜色,因此我创建了自定义主题并尝试设置editTextColor属性,这令人惊讶地工作:

<!-- 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并将其替换为{{1}在textAppearance样式textColor中设置属性。

@style/EditTextAppearance

这种<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最终会被应用!

答案 2 :(得分:0)

android:textColorandroid:textAppearanceEditText 中被忽略,因为 android:editTextColor 属性总是覆盖 EditText 的文本颜色(不要问我为什么,它是关于疯狂的机器人).

但是如果您将此属性添加到主题中,一切正常:

<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
     <item name="android:editTextColor">@null</item>
</style>
相关问题