EditText底线颜色在焦点上变化

时间:2015-08-14 10:47:25

标签: android android-edittext tint appcompat-v7-r22.2

以下是EditText' abc_edit_text_material可绘制的XML:

<selector>
    <item android:state_enabled="false" android:drawable="@drawable/abc_textfield_default_mtrl_alpha"/>
    <item android:state_pressed="false" android:state_focused="false" android:drawable="@drawable/abc_textfield_default_mtrl_alpha"/>
    <item android:drawable="@drawable/abc_textfield_activated_mtrl_alpha"/>
</selector>

它定义了一组图像而不是颜色(我无法跟踪应用颜色的时刻)。

以下代码使得底线始终保持红色,尽管其厚度随着焦点而变化(因此,相同的<selector>仍在使用中):

Drawable back = edittext.getBackground();
back.setColorFilter(0xffff0000, PorterDuff.Mode.SRC_ATOP);
editText.setBackground(back);

但是如果之后我恢复了默认的drawable,颜色会根据当前的焦点状态开始变化(灰色不聚焦,重点强调):

back.setBackgroundResource(R.drawable.abc_edit_text_material);

问题:

  1. 为什么在应用修改后的selector后使用了相同的Drawable
  2. 为什么在重新设置与背景相同的XML drawable后,颜色会开始响应焦点更改?是否有一些对象存储了与selector&#39; s state_enabled等对应的一组颜色?
  3. (也许,这个问题的答案也会明确前两个) 在哪一刻以及默认情况下如何应用颜色?我的意思是,它是否检查背景是否为默认值以及哪个类调用此着色?我尝试查看AppCompatEditTextView的来源,但没有找到类似的内容

1 个答案:

答案 0 :(得分:1)

  1. 为什么不呢?通过getBackground(),您可以检索StateListDrawable,它似乎接受彩色滤镜。

  2. 响应焦点是默认行为,以清除当前正在关注的项目以及键盘输入的位置。您没有重置过滤后的背景;你指的是原来的那个。

  3. 类存储其默认背景,并将过滤器应用于未聚焦(colorControlNormal)和焦点(colorControlActivated)状态。如果你改变它,那么它就会改变,过滤器就会消失。