我正在使用appcompat v7在Android 5及更低版本上获得一致的外观 . 它工作得很好 . 但是我无法弄清楚如何更改EditTexts的底线颜色和重点颜色 . 可能吗?
我试图定义一个自定义 android:editTextStyle
(参见下文),但我只是成功更改了完整的背景颜色或文本颜色,但没有更改底线和强调颜色 . 是否有特定的 property Value ?我必须通过 android:background
属性使用自定义可绘制图像吗?是不是可以用hexa指定颜色?
<style name="Theme.App.Base" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="android:editTextStyle">@style/Widget.App.EditText</item>
</style>
<style name="Widget.App.EditText" parent="Widget.AppCompat.EditText">
???
</style>
根据android API 21的消息,使用材质设计的EditTexts似乎使用 colorControlActivated
和 colorControlNormal
. 因此,我试图在先前的样式定义中覆盖这些属性,但它没有任何效果 . 可能appcompat不使用它 . 不幸的是,我找不到最后一个版本的appcompat的材料设计来源 .
23 回答
最后,我找到了解决方案 . 它只是覆盖了应用主题定义中
colorControlActivated
,colorControlHighlight
和colorControlNormal
的值,而不是您的edittext样式 . 然后,考虑将此主题用于您想要的任何活动 . 以下是一个例子:我觉得这需要一个答案,以防有人想改变一个编辑文本 . 我是这样做的:
您可以将edittext的背景设置为一个矩形,在左侧,右侧和顶部使用减去填充来实现此目的 . 这是xml示例:
如果要为聚焦的edittext提供不同的宽度和颜色,请使用选择器替换形状 .
虽然Laurents solution是正确的,但它有一些缺点,如评论中所述,因为不仅
EditText
的底线有色,而且Toolbar
的后退按钮,CheckBoxes
等也是如此 .幸运的是
v22.1
的appcompat-v7
引入了一些新的可能性 . 现在可以仅将特定主题分配给一个视图 . 直接从Changelog:因此,我们不是在全局主题中设置所需的颜色,而是创建一个新的颜色并仅将其分配给
EditText
.Example:
以供参考 . 这可以通过使用以下方式在xml中更改:
这是 API < 21 及以上的解决方案
希望它有所帮助
接受的答案是每个样式基础更多一点,但最有效的方法是在AppTheme样式中添加 colorAccent 属性,如下所示:
colorAccent属性用于整个应用程序中的窗口小部件着色,因此应该用于一致性
如果您使用
appcompat-v7:22.1.0+
,则可以使用DrawableCompat为您的小部件着色使用:
这将支持前Lollipop设备不仅21
解决问题的一个快速解决方案是查看yourappspackage / build / intermediates / explosion-aar / com.android.support / appcompat -v7 / res / drawable / for abc_edit_text_material.xml并将该xml文件复制到drawable文件夹中 . 然后,您可以从此选择器内更改9个补丁文件的颜色,以匹配您的首选项 .
以下是支持设计库( UPDATED for version 23.2.0 )中
TextInputLayout
的源代码的一部分,它以更简单的方式更改EditText
的底线颜色:如果你想以编程方式改变颜色,似乎所有上述代码现在都在23.2.0中变得无用 .
如果你想支持所有平台,这是我的方法:
我也被困在这个问题上太久了 .
我需要一个适用于v21以上和以下版本的解决方案 .
我终于发现了一个非常简单或许不理想但有效的解决方案:只需在EditText属性中将背景颜色设置为
transparent
即可 .我希望这能节省一些时间 .
对我来说,我修改了AppTheme和值colors.xml.colorControlNormal和colorAccent帮助我改变了EditText边框颜色 . 以及光标和“|”在EditText里面 .
这是colors.xml
我把android:textCursorDrawable属性取出到了我放在editText样式中的@null . 当我尝试使用它时,颜色不会改变 .
只需在
EditText
中添加android:backgroundTint
属性即可 .我使用这种方法来改变PorterDuff的线条颜色,没有其他可绘制的颜色 .
如果您想在不使用app颜色的情况下更改底线,请在主题中使用以下行:
我不知道另一个解决方案 .
经过2天的努力,我找到了解决这个问题的有效方案,下面的解决方案非常适合他们只想改变一些编辑文本,通过java代码更改/切换颜色,并希望克服由于使用setColorFilter()方法而在OS版本上出现的不同行为问题 .
在xml中使用
添加样式线条
用于切换颜色的java代码
在Activit.XML中添加代码
哪里
BackgroundTint=color
为您所需的颜色我对这个问题感到非常困惑 . 我已经尝试了这个线程中的所有内容,而在其他线程中,但无论我做了什么,我都无法将下划线的颜色更改为默认蓝色以外的任何其他颜色 .
我终于弄清楚发生了什么 . 在制作新实例时我(错误地)使用了
android.widget.EditText
(但我的其他组件来自appcompat库) . 我本应该用android.support.v7.widget.AppCompatEditText
. 我用new AppCompatEditText(this)
替换new EditText(this)
,问题立即得到解决 . 事实证明,如果你实际上正在使用AppCompatEditText
,它只会尊重你主题的accentColor
(如上面的几条评论所述),不需要额外的配置 .这是最简单,最有效/可重用/适用于所有API的
像这样创建一个自定义的EditText类:
然后像这样使用它:
要动态更改EditText背景,可以使用ColorStateList .
致谢:This SO answer about ColorStateList is awesome .
请根据您的需要修改此方法 . 这对我有用!