无法在样式中设置colorControlNormal和android:textColor

时间:2017-01-23 17:12:17

标签: android android-edittext material-design android-theme android-styles

我正在尝试设置材质EditText视图的样式:

<style name="AppTheme.EditText" parent="@style/Widget.AppCompat.EditText">
    <item name="android:textColor">@color/white</item>
    <item name="android:textColorHint">#8AFFFFFF</item>

    <item name="colorControlNormal">@color/white</item>
    <item name="colorControlActivated">@color/white</item>
    <item name="colorControlHighlight">@color/white</item>
</style>

然后我在我的主题上应用这个风格:

<style name="AppTheme">
    <item name="editTextStyle">@style/AppTheme.EditText</item>
</style>

将主题应用于活动:

  <activity
        android:name=".MyActivity"
        android:configChanges="keyboardHidden|orientation|screenSize"
        android:windowSoftInputMode="stateAlwaysHidden"
        android:theme="@style/AppTheme">

然而,这并没有改变下划线颜色。

我知道我可以更改accentColor以更改下划线颜色,但我不想这样做,因为我需要我的强调颜色与其他一些控件不同。

我可以像这样设置控件下划线颜色吗?

5 个答案:

答案 0 :(得分:22)

原因不起作用 colorControlNormal主题的attr,而android:textColor样式属性。要更改colorControlNormal,您必须覆盖主题,要更改android:textColor值,您必须覆盖样式colorControlNormal中没有名为@style/Widget.AppCompat.EditText的属性或其中的任何父级。因此,在执行此操作时,您完全没有任何要求:

<style name="AppTheme.EditText" parent="@style/Widget.AppCompat.EditText">
    <item name="colorControlNormal">@color/white</item>
</style>

<强>解决方案: 要实际更改colorControlNormal的值,您必须在主题中更改它。要在不更改活动主题的情况下执行此操作,您可以:

1 /创建一个仅包含您想要更改的主题属性的ThemeOverlay:

<style name="AppTheme.EditText"> 
    <item name="colorControlNormal">@color/white</item>
</style>

2 /仅在EditText视图中使用

<EditText
    android:layout_width="match_parent"
    android:theme="@style/AppTheme.EditText"
/>

这里实际发生的是将使用View的主题属性(如果存在)。活动的主题将用作后备。

您可以随时更改活动主题的colorControlNormal以影响整个活动。

答案 1 :(得分:2)

在这里,您只需按照以下步骤完成即可。

第1步:创建样式

android:textCursorDrawable属性设置为@null会导致使用android:textColor作为光标颜色。

<style name="editTextTheme" parent="@style/Widget.AppCompat.EditText">

        <item name="android:textColorHint">@color/white</item>

        <item name="colorControlNormal">@color/white</item>
        <item name="colorControlActivated">@color/white</item>
        <item name="colorControlHighlight">@color/white</item>

        <item name="colorAccent">@color/white</item>
        <item name="android:textCursorDrawable">@null</item>
        <item name="android:textColorPrimary">@color/white</item>

    </style>

第2步:将该风格用作主题

<style name="MyTheme">
        <item name="theme">@style/editTextTheme</item>
</style>

第3步:在您的组件中实现该主题

<android.support.v7.widget.AppCompatEditText
        android:id="@+id/editText"
        style="@style/MyTheme"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:hint="Enter Name"
        android:inputType="textPersonName" />

答案 2 :(得分:1)

这个解决方案对我有用。它只是在您的edittext样式主题中覆盖colorControlActivatedcolorControlHighlightcolorControlNormal的值。其他想法是,如果你想改变光标颜色,那么android:textCursorDrawable使用这个属性。我将此edittext样式也放在style.xml(v21)中。然后,想想将此主题用于您想要的任何活动。以下是一个例子:

  

第一个解决方案

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <!--Edittext theme -->
        <item name="editTextStyle">@style/App_EditTextStyle</item>
</style>

<style name="App_EditTextStyle" parent="@style/Widget.AppCompat.EditText">
    <item name="android:textColor">@color/white</item>
    <item name="android:textColorHint">@color/black</item>

    <item name="colorControlNormal">@color/white</item>
    <item name="colorControlActivated">@color/white</item>
    <item name="colorControlHighlight">@color/white</item>

    <item name="android:backgroundTint" >@color/white</item>
    <item name="backgroundTint">@color/white</item>

    <item name="android:textCursorDrawable">@color/white</item>
</style>
  

其他解决方案

您也可以通过编程方式进行设置。这是API&lt;的解决方案。 21岁及以上

Drawable drawable = yourEditText.getBackground(); // get current EditText drawable 
    drawable.setColorFilter(Color.GREEN, PorterDuff.Mode.SRC_ATOP); // change the drawable color

    if(Build.VERSION.SDK_INT > 16) {
        yourEditText.setBackground(drawable); // set the new drawable to EditText
    }else{
        yourEditText.setBackgroundDrawable(drawable); // use setBackgroundDrawable because setBackground required API 16
    }

答案 3 :(得分:1)

你的style.xml:

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="editTextStyle">@style/MyEditTextStyle</item>
</style>

<style name="MyEditTextStyle" parent="@style/Widget.AppCompat.EditText">
    <item name="android:textColor">#FF0</item>
</style>

<style name="AppTheme.MyEditTextTheme">
    <item name="android:textColorHint">#8AFFFFFF</item>

    <item name="colorControlNormal">#FF0</item>
    <item name="colorControlActivated">#FF0</item>
    <item name="colorControlHighlight">#FF0</item>
</style>

然后将 MyEditTextTheme 应用为EditText的主题:

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/AppTheme.MyEditTextTheme"/>

现在,只有此EditText才有黄色下划线。你也可以在MyEditTextTheme中改变colorAccent,它不会改变AppTheme的colorAccent值。

答案 4 :(得分:0)

您可以通过执行以下操作来更改下划线的颜色:

<style name="AppTheme.EditText" parent="@style/Widget.AppCompat.EditText">
    <item name="android:textColor">@color/white</item>
    <item name="android:textColorHint">#8AFFFFFF</item>

    <item name="android:backgroundTint">@color/white</item>
    <item name="backgroundTint">@color/white</item>
</style>

您应该将带有item命名空间的android放在自己的styles-v21.xml文件中以避免Android Studio警告,但这并非100%必要。我在API 19模拟器中对此进行了测试,它工作得很好,没有崩溃。