2015-08-14 3 views
1

Вот 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); 

вопросов:

  1. Почему такое же selector используется после применения модифицированного Drawable?
  2. Почему цвета начинают реагировать на изменения фокусировки после переопределения того же XML, который можно использовать в качестве фона? Есть ли какой-нибудь объект, сохраняющий набор цветов, соответствующий selector's state_enabled и т. Д.?
  3. (Может быть, ответ на этот вопрос также будет ясно из двух предыдущих)
    В какой момент и как применяется цвет по умолчанию? Я имею в виду, проверяет ли он значение по умолчанию и какой класс вызывает эту раскраску? Я попробовал, глядя через источники из AppCompatEditText в View и не нашли ничего подобного

ответ

1
  1. Почему нет? К getBackground() вы получаете StateListDrawable, которые, похоже, принимают цветовые фильтры.

  2. Реагирование на фокусировку - это поведение по умолчанию, позволяющее очистить элемент, который в данный момент фокусируется, и куда идет ваш ввод на клавиатуре. Вы не сбрасываете фильтрованный фон; вы указываете на оригинал.

  3. Класс сохраняет свой фон по умолчанию и применяет фильтры к нефокусированным (colorControlNormal) и сфокусированным (colorControlActivated) состояниям. Если вы измените его, то он изменится и фильтры исчезнут.

+0

Я довольно смущен о 2-м. 'setBackgroundResource()' принимает произвольный XML, делает «Drawable» и передает его в 'setBackgroundDrawable()' - поэтому, похоже, что любой XML должен быть окрашен как стандартный. Но даже копия «abc_edit_text_material» остается черной - только оригинал окрашивается. Зачем? Кажется, нет никакой проверки, если 'abc_edit_text_material' был передан как аргумент' setBackgroundResource() 'или не – Alex

+1

Невозможно найти источники прямо сейчас, но я могу заверить, что он проверяет свои собственные ресурсы: по умолчанию будет отображаться тонировка, другие не будут. Это также происходит, например, для значков панели инструментов: меню «назад стрелка» и «переполнение» будет тонировано «colorControlNormal», но только если они принадлежат встроенному набору значков appcompat. Если вы скопируете этот селектор в свой собственный каталог, возможно, с другим именем, оно не будет тонировано. – natario

+1

[здесь] (http://stackoverflow.com/a/26817918/4288782) - ответ, который вы ищете. – natario

Смежные вопросы