EditText 底线颜色在焦点上变化

EditText bottom line colour changing on focus

这是 EditTextabc_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);

但如果在那之后我恢复默认的可绘制对象,颜色会根据当前的焦点状态开始变化(灰色未聚焦,重音聚焦):

back.setBackgroundResource(R.drawable.abc_edit_text_material);

问题:

  1. 为什么在应用修改后的 Drawable 后使用相同的 selector
  2. 为什么在重新设置与背景相同的 XML 可绘制对象后,颜色开始响应焦点变化?是否有一些对象存储了一组与 selectorstate_enabled 等对应的颜色?
  3. (说不定,回答这一条也能把前两条说清楚了)
    在什么时候以及如何默认应用颜色?我的意思是,它是否检查背景是否为默认背景以及 class 是否需要这种颜色?我尝试查看从 AppCompatEditTextView 的来源,但没有找到类似的东西
  1. 为什么不呢?通过 getBackground() 你检索了一个 StateListDrawable,它似乎接受滤色器。

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

  3. Class 存储其默认背景并将滤镜应用于未聚焦 (colorControlNormal) 和聚焦 (colorControlActivated) 状态。如果你改变它,嗯,它改变了,过滤器也没有了。