【问题标题】:Cannot set colorControlNormal and android:textColor in style无法在样式中设置 colorControlNormal 和 android:textColor
【发布时间】:2017-06-08 06:55:35
【问题描述】:

我正在尝试设置材质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 来更改下划线颜色,但我不想这样做,因为我需要我的强调色与其他一些控件不同。

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

【问题讨论】:

  • 视图是否以编程方式在 Java 代码中的其他任何地方被更改? (除了您在此处列出的 xml)
  • 没有以编程方式改变样式/主题/颜色。
  • 可能是一个愚蠢的问题,但您是将主题应用于相关活动(或整个项目)吗?如果您的样式更改甚至没有影响 TextColor,那么您的样式更改似乎不会影响任何内容。
  • @LukeWaggoner 不是一个愚蠢的问题 :) 我添加了如何将该主题应用于问题的活动。
  • 当您将样式直接应用到 .xml 中的 EditText android:theme="@style/AppTheme.EditText"? 时会发生什么

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


【解决方案1】:

您可以通过以下方式更改下划线的颜色:

<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 模拟器中对此进行了测试,它运行良好,没有崩溃。

【讨论】:

  • 谢谢。我确实看到了一个问题,即仅更改下划线颜色,但光标和光标指针仍然是强调颜色。这是 colorControlActivated 应该改变的。
  • 注意,如果我将 colorControlActivated 放在 AppTheme 而不是 EditText 样式中,它可以工作。但后来我为该控件(文本颜色和控件颜色)设置了 2 种不同样式的样式。
  • 添加这个:android:textCursorDrawable="@null",它会将光标的颜色更改为文本颜色。
  • 如果您在整个项目或活动上设置accentColor,我相信这将覆盖您的ColorControlActivated 属性。不积极。尝试使用 android 命名空间添加当前 colorControl 属性的 3 个副本。
【解决方案2】:

这个解决方案对我有用。 s它只包括在你的edittext样式主题中覆盖colorControlActivated、colorControlHighlight和colorControlNormal的值。其他想法是,如果您也想更改光标颜色,那么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

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 步:创建样式

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

    【讨论】:

      【解决方案4】:

      你的 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 值。

      【讨论】:

        【解决方案5】:

        无法正常工作的原因: colorControlNormal 是 theme 的属性,而 android:textColor 是 style 属性。要更改colorControlNormal,您必须覆盖一个主题,要更改android:textColor 的值,您必须覆盖一个样式。 @style/Widget.AppCompat.EditText 中没有名为 colorControlNormal 的属性或其任何父级。因此,您在执行此操作时不会覆盖任何内容:

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

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

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

        【讨论】:

        • 有没有办法将 EditText 主题应用到应用程序中的所有小部件?可以在 App Theme 中设置它吗?
        • 可以在主题中设置editTextStyle属性。默认为@style/Widget.AppCompat.EditText&lt;item name="editTextStyle"&gt;@style/Widget.AppCompat.EditText&lt;/item&gt;
        • 我指的是你可以应用到EditText的主题。
        • 是的。在应用程序主题中设置它会起作用。或者换句话说,设置应用主题属性
        • 真的只适用于控件的属性。谢谢!
        猜你喜欢
        • 2020-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-14
        • 2023-03-27
        • 2011-07-15
        • 2016-04-05
        • 2022-01-06
        相关资源
        最近更新 更多