【问题标题】:EditText bottom line colour changing on focusEditText 底线颜色改变焦点
【发布时间】:2015-08-14 10:47:25
【问题描述】:

这是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>

它定义了一组图像,但没有定义颜色(我无法跟踪应用颜色的时刻)。

以下代码使底线始终保持红色,尽管它的粗细会随着焦点的变化而变化(因此,相同的 &lt;selector&gt; 仍在使用中):

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

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

back.setBackgroundResource(R.drawable.abc_edit_text_material);

问题:

  1. 为什么在应用修改后的Drawable 后使用相同的selector
  2. 为什么在重新设置与背景相同的 XML 可绘制对象后颜色开始响应焦点变化?是否有一些对象存储一组与selectorstate_enabled 等对应的颜色?
  3. (或许这一篇的答案也会把前两篇搞清楚)
    默认情况下在哪个时刻以及如何应用颜色?我的意思是,它是否检查背景是否是默认的以及哪个类需要这种颜色?我尝试查看从AppCompatEditTextView 的来源,但没有找到类似的东西

【问题讨论】:

    标签: android android-edittext tint android-appcompat


    【解决方案1】:
    1. 为什么不呢?通过getBackground(),您检索到StateListDrawable,它似乎接受彩色滤镜。

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

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

    【讨论】:

    • 我对第二个感到很困惑。 setBackgroundResource() 采用任意 XML,生成 Drawable 并将其传递给 setBackgroundDrawable() - 因此,看起来任何 XML 都应该被着色为默认值。但即使是abc_edit_text_material 的副本也会保持黑色——只有原件会被着色。为什么?似乎没有任何检查 abc_edit_text_material 是否作为 setBackgroundResource() 参数传递
    • 现在找不到资源,但我可以保证它正在检查自己的资源:默认一个会着色,其他不会。例如,工具栏图标也会发生这种情况:后退箭头和溢出菜单将被着色为colorControlNormal,但前提是它们属于内置的 appcompat 图标集。如果您将该选择器复制粘贴到您自己的目录中,也许使用另一个名称,它不会被着色。
    • here 是您正在寻找的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-21
    相关资源
    最近更新 更多