Android

Changing EditText bottom line color with appcompat v7

Изменение цвета нижней строки EditText с помощью appcompat v7

Я использую appcompat v7, чтобы обеспечить согласованный внешний вид на Android 5 и ниже. Работает довольно хорошо. Однако я не могу понять, как изменить цвет нижней строки и цвет акцента для EditTexts. Возможно ли это?

Я пытался определить пользовательский android:editTextStyle (см. Ниже), но мне удалось изменить только полный цвет фона или цвет текста, но не нижнюю строку и не цвет акцента. Есть ли конкретное значение свойства для использования? должен ли я использовать пользовательское рисованное изображение через android:background свойство? невозможно указать цвет в hexa?

 <style name="Theme.App.Base" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="android:editTextStyle">@style/Widget.App.EditText</item>
</style>

<style name="Widget.App.EditText" parent="Widget.AppCompat.EditText">
???
</style>

Согласно источникам Android API 21, EditTexts с material design, похоже, используют colorControlActivated и colorControlNormal. Поэтому я попытался переопределить эти свойства в предыдущем определении стиля, но это не дало эффекта. Вероятно, appcompat его не использует. К сожалению, я не могу найти исходные тексты для последней версии appcompat с material design.

Переведено автоматически
Ответ 1

Наконец, я нашел решение. Оно просто заключается в переопределении значения для colorControlActivated, colorControlHighlight и colorControlNormal в определении темы вашего приложения, а не в вашем стиле edittext. Затем подумайте о том, чтобы использовать эту тему для любых действий, которые вы пожелаете. Ниже приведен пример:

<style name="Theme.App.Base" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="colorControlNormal">#c5c5c5</item>
<item name="colorControlActivated">@color/accent</item>
<item name="colorControlHighlight">@color/accent</item>
</style>
Ответ 2

Я чувствовал, что на этот вопрос нужен ответ на случай, если кто-то захочет изменить только один edittext. Я делаю это следующим образом:

editText.getBackground().mutate().setColorFilter(ContextCompat.getColor(context, R.color.your_color), PorterDuff.Mode.SRC_ATOP);
Ответ 3

Хотя решение Лоренца правильное, оно имеет некоторые недостатки, как описано в комментариях, поскольку окрашивается не только нижняя строка EditText, но и кнопка "Назад" Toolbar, CheckBoxes и т.д.

К счастью, v22.1 of appcompat-v7 представила несколько новых возможностей. Теперь можно назначить определенную тему только для одного представления. Прямо из журнала изменений:


Устаревшее использование приложения: тема для оформления панели инструментов. Теперь вы можете использовать Android: theme для панелей инструментов на всех устройствах с API уровня 7 и выше и android: поддержка темы для всех виджетов на устройствах с API уровня 11 и выше.


Итак, вместо установки желаемого цвета в глобальной теме мы создаем новую и назначаем ее только для EditText.

Пример:

<style name="MyEditTextTheme">
<!-- Used for the bottom line when not selected / focused -->
<item name="colorControlNormal">#9e9e9e</item>
<!-- colorControlActivated & colorControlHighlight use the colorAccent color by default -->
</style>

<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/MyEditTextTheme"/>
Ответ 4

Это можно изменить в XML с помощью:

Для справки используйте API >= 21 совместимость:

android:backgroundTint="@color/blue"

Для использования обратной совместимости с API < 21:

app:backgroundTint="@color/blue"
2023-06-10 10:34 java android android-layout android-edittext