改变EditText底部线的颜色 android
改变EditText底部线的颜色 android
我正在使用appcompat v7来在Android 5及以下版本上保持外观一致。效果相当不错。然而,我无法弄清楚如何更改EditText的底线颜色和强调颜色。这可行吗?
我尝试定义了一个自定义的android:editTextStyle
(如下所示),但我只成功地更改了整个背景颜色或文本颜色,而无法更改底线和强调颜色。有特定的属性值要使用吗?我是否必须通过android:background
属性使用自定义的可绘制图像?无法指定十六进制颜色吗?
根据Android API 21的源代码,具有Material Design的EditText似乎使用colorControlActivated
和colorControlNormal
。因此,我尝试在上述样式定义中覆盖这些属性,但没有效果。可能是因为appcompat没有使用它。不幸的是,我找不到最新版本appcompat的源代码。
问题原因:原先的解决方法会导致不仅仅是EditText的底线会被着色,Toolbar、CheckBox等其他控件也会受到影响。
解决方法:在v22.1的appcompat-v7库中,可以将特定的主题分配给一个视图。不再需要在全局主题中设置所需的颜色,而是创建一个新的主题并仅将其分配给EditText。
具体操作如下:
1. 创建一个新的主题MyEditTextTheme,设置底线未被选中或聚焦时的颜色为#9e9e9e。
2. 将新的主题赋给EditText的android:theme属性。
示例代码如下:
需要注意,如果不加android前缀,colorControlNormal会使用appcompat库的方法对控件进行着色,而加上android前缀则会使用系统的方法,这只在API 21+设备上可用。
有用户表示使用22.2.0版本的AppCompat库时,这个方法不起作用,而将colorAccent设置为所需颜色则有效。
对于只想改变应用中的一个EditText的用户来说,这种方法非常完美(正是我所需要的!谢谢!)。
在Android中更改EditText底线颜色的原因是,通过覆盖应用主题中的colorControlActivated
、colorControlHighlight
和colorControlNormal
的值来实现,而不是在EditText的样式中。然后,将此主题用于所需的任何活动。以下是一个示例:
以上更改会影响哪些内容?只有TextView还是其他视图也会受到影响。请添加更多细节。
我注意到菜单汉堡包、返回按钮和滚动条的颜色已经改变为colorControlNormal。
我尝试了你的解决方案,它在设计界面上有效,但在实际设备和模拟器上运行时无效。我的编辑文本仍然是黑色的。
这会改变底线的颜色,但也会改变其他控件,如复选框、单选按钮等。它还会改变整个应用程序/活动中的每个EditText。如果要更改单个EditText的底线颜色(如我所做的),则必须覆盖该EditText的android:background属性。没有其他方法。
我最近在早于Lollipop版本的设备上遇到了问题。创建自定义EditText会丢失在AppCompat库的Styles XML中定义的这些颜色。为了保持这些颜色,请参考's answer'。并在自定义EditText的构造函数中以程序化方式使用它。
很好的答案,但不幸的是,在父级主题为style/Theme.Holo.Light.NoActionBar的主题上无效。有什么线索吗?
如果您使用的是AppCompat v22支持库,可以在EditText中指定主题,如:android:theme="/Theme.App.Base
。这将确保样式不会影响您不想更改的布局中的其他视图。
在Jelly Bean(4.2)上不起作用,但在Lollipop上起作用。
活动应继承自AppCompatActivity
。如果继承自Activity
,它将不起作用。
由于某种原因,我必须使用android:colorControlNormal
、android:colorControlActivated
和android:colorControlHighlight
才能使其起作用。
问题的原因是在Android的EditText中更改底部线条颜色时,使用了以下代码:
editText.getBackground().mutate().setColorFilter(ContextCompat.getColor(context, R.color.your_color), PorterDuff.Mode.SRC_ATOP);
然而,当调用
editText.getBackground().resetColorFilter()
时,可能会引发许多错误。这是因为在Lollipop上,通过调用
editText.getBackground().mutate()
来修改Drawable的颜色,会导致应用程序中所有EditText的颜色都被改变,而不仅仅是单个EditText。
解决方法是在
editText.getBackground().mutate()
后添加
.mutate()
方法。这样做可以确保每个EditText的Drawable都是单独的,改变其中一个EditText的颜色不会影响其他EditText。
如果使用的是AppCompatEditText,则不能使用这种方法。解决此问题的方法是使用以下代码:
editText.getBackground().setColorFilter(null);
这将重置EditText的背景颜色,但需要注意的是
editText.setBackgroundTintList(null)
不起作用。
总结一下,要在Android中更改EditText的底部线条颜色,可以使用以下代码:
editText.getBackground().mutate().setColorFilter(ContextCompat.getColor(context, R.color.your_color), PorterDuff.Mode.SRC_ATOP);
要重置EditText的背景颜色,可以使用以下代码:
editText.getBackground().setColorFilter(null);
需要注意的是,这些解决方法适用于不同的EditText类型。如果使用的是AppCompatEditText,则需要使用第二种解决方法。另外,getColor
方法在API 23之后已经被弃用,应该使用ContextCompat.getColor(context, R.color.your_color)
方法代替。