Изменение фона Button через стили
Есть некая форма, в ней кнопка "отправить". Изначально кнопка неактивная (серая), по мере заполнения формы в определённый момент кнопка активируется (должен меняться цвет фона и текста).
Я создал два стиля
<style name="button">
...
<item name="android:background">@color/colorButtonBackground</item>
<item name="android:textColor">@color/colorButtonCaption</item>
</style>
<style name="button.disabled" parent="button">
<item name="android:background">@color/colorButtonBackgroundDisabled</item>
<item name="android:textColor">@color/colorButtonCaptionDisabled</item>
</style>
Сама кнопка изначально неактивная:
<Button
android:id="@+id/submit"
style="@style/button.disabled"
android:text="@string/login_submit"
...
/>
Отображается, как надо.
Затем, я проверяю заполненность формы и ставлю стиль кнопки.
Как я нагуглил нужно использовать setTextApperance():
val style = if (enabled) R.style.button else R.style.button_disabled
if (SDK_INT >= 23) {
submit.setTextAppearance(style)
} else {
submit.setTextAppearance(context, style)
}
Однако, цвет текста меняется, а вот цвет фона нет. Аналогично, если изначально задать "активную" тему. Цвета будут нужные, но при переключении в "неактивную" поменятся только цвет текста. Проверка показала, что также меняются другие параметры, связанные именно с текстом (размер, например), но не с самим блоком (margin и т.п)
На мысли наводит название метода setTextAppearance, что работает он только с текстом.
Но я не вижу никаких других подобных методов для того, чтобы применить всю тему.
Ответы (1 шт):
Можете помимо setTextAppearance так же менять background у кнопки.
Лучшим вариантом будет создать selector который среагирует на состояние кнопки
res/drawable/my_button.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:state_enabled="true"
android:background="@color/colorButtonBackground" />
<item
android:state_enabled="false"
android:background="@color/colorButtonCaptionDisabled" />
</selector>
Поставить его фоном для кнопки android:background="@drawable/my_button" и управлять состоянием кнопки submit.setEnabled(false/true);
Или использовать библиотеку paris
Paris.style(submit).apply(R.style.MyStyle);//java
submit.style(R.style.MyStyle)//kotlin