Продолжаю тему небольших постов с разбором простых вещей, сделанных неочевидно. Предыдущий пост тут.
Сегодня про UX/UI, а именно про различные состояния у кликабельных вьюшек (state_pressed, state_enable).
Кейс 1 - state_pressed. Иногда пользуясь некоторыми приложениями, замечаю такую штуку: нажимаю какую-нибудь кнопку или иконку и состояние элемента никак не меняется.
Почему так происходит?
Иногда разработчики делают кликабельными компоненты отличные от Button, ImageButton и т.д., например TextView, ImageView, различные Layout`s или кастомные вьюшки, но соответствующий бэкграунд для них не устанавливают. Как мы с вами знаем, бэкграунд можно задавать через xml drawable, в котором мы предварительно описываем нужные стейты. Для Button`s это уже заложено системой, у других компонентов нет.
Это всё можно сделать элементарно и просто, но по каким-то причинам некоторые разработчики этого не делают…
Так вот, если вы делаете кликабельными такие компоненты – используйте хотя бы готовые, системные drawable, это на 1 строчку кода больше, а получится нормальный кликабельный с ripple эффектом компонент и приложение будет более юзерфрендли 😉
Вот как можно задать некоторые системные drawable
1. android:background="?android:attr/selectableItemBackground" – для текстовых кнопок
2. android:background="?android:attr/selectableItemBackgroundBorderless" – для текстовых кнопок
3. style="?attr/toolbarNavigationButtonStyle" – для иконок
Кейс 2 – state_enable
Не давно формировал счет в приложении "Налог" и у них в это время были технические работы на бэке. При нажатии на кнопку "Выдать счет" ничего не происходит, я тыкаю еще раз – тоже самое и так было N-количество раз… По итогу удалось сформировать счет – вроде всё ок. Через несколько дней увидел, что одинаковых счетов сформировалось штук 15 😳. Я конечно же не нужные аннулировал, но давайте разберёмся почему так могло произойти.
1. Не было состояния загрузки (progress_bar, progress_view)
2. Кнопка была всегда активной
Как решать подобное?
Для асинхронных функций (особенно для критично важных) на время выполнения нужно показывать состояние загрузки и дизейблить кнопку. Больше наверное тут и добавить нечего)