Вот abc_edit_text_material
вытяжке XML-EditText
«s:EditText нижняя линия цвет меняется на фокус
<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);
вопросов:
- Почему такое же
selector
используется после применения модифицированногоDrawable
? - Почему цвета начинают реагировать на изменения фокусировки после переопределения того же XML, который можно использовать в качестве фона? Есть ли какой-нибудь объект, сохраняющий набор цветов, соответствующий
selector
'sstate_enabled
и т. Д.? - (Может быть, ответ на этот вопрос также будет ясно из двух предыдущих)
В какой момент и как применяется цвет по умолчанию? Я имею в виду, проверяет ли он значение по умолчанию и какой класс вызывает эту раскраску? Я попробовал, глядя через источники изAppCompatEditText
вView
и не нашли ничего подобного
Я довольно смущен о 2-м. 'setBackgroundResource()' принимает произвольный XML, делает «Drawable» и передает его в 'setBackgroundDrawable()' - поэтому, похоже, что любой XML должен быть окрашен как стандартный. Но даже копия «abc_edit_text_material» остается черной - только оригинал окрашивается. Зачем? Кажется, нет никакой проверки, если 'abc_edit_text_material' был передан как аргумент' setBackgroundResource() 'или не – Alex
Невозможно найти источники прямо сейчас, но я могу заверить, что он проверяет свои собственные ресурсы: по умолчанию будет отображаться тонировка, другие не будут. Это также происходит, например, для значков панели инструментов: меню «назад стрелка» и «переполнение» будет тонировано «colorControlNormal», но только если они принадлежат встроенному набору значков appcompat. Если вы скопируете этот селектор в свой собственный каталог, возможно, с другим именем, оно не будет тонировано. – natario
[здесь] (http://stackoverflow.com/a/26817918/4288782) - ответ, который вы ищете. – natario