Обложка канала

Mobile Native

Полезные материалы по мобильной разработке. Статьи, подборки, нововведения, анонсы.

Mobile Native

4 года назад
Открыть в
Продолжаю тему небольших постов с разбором простых вещей, сделанных неочевидно. Предыдущий пост тут. Сегодня про 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. Кнопка была всегда активной Как решать подобное? Для асинхронных функций (особенно для критично важных) на время выполнения нужно показывать состояние загрузки и дизейблить кнопку. Больше наверное тут и добавить нечего)