改变EditText底部线的颜色 android

9 浏览
0 Comments

改变EditText底部线的颜色 android

我正在使用appcompat v7来在Android 5及以下版本上保持外观一致。效果相当不错。然而,我无法弄清楚如何更改EditText的底线颜色和强调颜色。这可行吗?

我尝试定义了一个自定义的android:editTextStyle(如下所示),但我只成功地更改了整个背景颜色或文本颜色,而无法更改底线和强调颜色。有特定的属性值要使用吗?我是否必须通过android:background属性使用自定义的可绘制图像?无法指定十六进制颜色吗?

 
 

根据Android API 21的源代码,具有Material Design的EditText似乎使用colorControlActivatedcolorControlNormal。因此,我尝试在上述样式定义中覆盖这些属性,但没有效果。可能是因为appcompat没有使用它。不幸的是,我找不到最新版本appcompat的源代码。

0
0 Comments

问题原因:原先的解决方法会导致不仅仅是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的用户来说,这种方法非常完美(正是我所需要的!谢谢!)。

0
0 Comments

在Android中更改EditText底线颜色的原因是,通过覆盖应用主题中的colorControlActivatedcolorControlHighlightcolorControlNormal的值来实现,而不是在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:colorControlNormalandroid:colorControlActivatedandroid:colorControlHighlight才能使其起作用。

0
0 Comments

问题的原因是在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)方法代替。

0