User Interface
Со всеми приложениями пользователь взаимодействует через интерфейс - User Interface (UI). Ранее мы уже задели создание интерфейса, а в данном блоке рассмотрим эту тему детальнее.
Основы
Для начала нужно ознакомиться с главными UI классами:
- Activity - окно приложения, единственное что показывает UI в Android пользователю
- Fragment - часть UI (может быть отдельным экраном приложения, может частью экрана)
- View - небольшой блок пользовательского интерфейса, например текст, кнопка, поле ввода и т.д.
Для ознакомления на практике пройти уроки из официального Android курса - Android Basics - Layouts.
Про Fragment
полезно пройти CodeLab - Advanced Android 01.1: Fragments (в CodeLab используется Java, но при выполнении можно использовать Kotlin).
Также, для изучения жизненного цикла Activity
и Fragment
, хорошо подойдет CodeLab Android Kotlin Fundamentals: Lifecycles and logging и её продолжение - Android Kotlin Fundamentals: Complex Lifecycle Situations
Вопросы для самопроверки:
- Чем отличаются
Activity
иFragment
? - Какой жизненный цикл
Activity
? - Какой жизненный цикл
Fragment
? - Что произойдет с введенным в
EditText
текстом, если произойдет изменение конфигурации (например поворот экрана)? - Как сохранить положение скролла в
RecyclerView
илиScrollView
при повороте экрана?
Экраны и навигация
Современные android приложения строятся по подходу Single Activity, о котором рассказано в следующем видео.
В дополнение можно прочитать статью на русском языке.
Для построения навигации между экранами Google рекомендует использовать Android Navigation Component, который наиболее полнофункционален именно с подходом Single Activity, когда мы в пределах одного Activity переходим между разными Fragment'ами.
Более подробно изучить работу с навигацией и попрактиковаться можно по следующим урокам:
Обязательно прочитайте про передачу данных между компонентами. Из этой статьи вы узнаете:
- как правильно передавать данные между
Fragment
-ами иActivity
- почему следует передавать идентефикаторы данных, а не сами данные
- как реализовать строгое API передачи данных
Верстка экрана
Верстка UI в Android на данный момент возможна несколькими способами:
- Jetpack Compose - новый, современный подход, declarative UI
- XML layouts - все еще наиболее популярный, но начинающий устаревать
Мы будем рассматривать верстку через xml, так как она все ещё наиболее распространена и эти навыки точно потребуются на проектах ближайшие годы.
info
Тем кто заинтересован посмотреть что такое Jetpack Compose подойдет набор уроков от Google - Jetpack Compose
С версткой через xml можно познакомиться через CodeLab - Android Kotlin Fundamentals: LinearLayout using the Layout Editor
Многое в практиках от Google показывается через Layout Editor, но важно также смотреть и понимать что получается в результирующем xml. Чтобы понимать, к чему приводят действия в Layout Editor, читайте xml после действий в редакторе.
Также, общепринятой практикой при верстке через xml является использование tools для всех UI элементов.
ConstraintLayout
ConstraintLayout
- это универсальный и многофункциональный лейаут. Его основное преимущество - без множественной вложенности описать сложное расположение элементов на экране. Он используется очень часто, потому что его возможности сильно упрощают реализацию сложных задач.
Подробно про ConstraintLayout
- Build a Responsive UI with ConstraintLayout. И практика для закрепления Use ConstraintLayout to design your Android views.
RecyclerView
Важный элемент практически всех мобильных приложений - список элементов. На Android он реализуется с помощью RecyclerView. Подробно ознакомиться с концептом этого элемента и попрактиковаться можно в CodeLab - Android Kotlin Fundamentals: RecyclerView fundamentals.
Чтобы лучше разобраться с требованиями к RecyclerView.Adapter
рекомендуем прочитать статью.
Вопросы для самопроверки:
- Что такое
RecyclerView
? - В каких случаях нужен
RecyclerView
, а в каких достаточноLinearLayout
?
Связь верстки и кода
Для обращения к UI элементам из кода мы используем инструмент View Binding. Он из xml layout'ов автоматически генерирует классы, которые мы можем использовать в коде и обращаться к разным view как к полям этого сгенерированного класса.
Также можно посмотреть следующее видео:
AndroidX & Jetpack
В текущем блоке мы использовали разные библиотеки от AndroidX и Jetpack. Разберемся с тем что это за библиотеки.
AndroidX - набор библиотек, обеспечивающих поддержку более новых API на старых версиях устройств. Они позволяют разработчику не задумываться о том, на какой версии android будет запускаться приложение, когда требуемый функционал менялся между разными релизами android. В прошлом этот набор библиотек назывался Android Support Libraries
. Рекомендуется использовать AndroidX API, так как оно обновляется чаще релизов Android OS и может включать множество разных багфиксов (как и новых багов, куда без них).
Jetpack - набор библиотек (включающий и AndroidX), предоставляющий множество готовых решения для разных типовых задач разработки приложений - базы данных, архитектурные компоненты, работа с постраничной загрузкой, удобная работа с камерой и прочее (список библиотек большой, можно посмотреть на сайте).
Забота о User Experience (UX)
Разработчики приложений должны стремиться к удобному и понятному пользовательскому опыту. Важно помнить, что мы пишем код не для себя, а чтобы пользователи могли получить приложение которое решает их задачи. Приложение может приносить боль при использовании, а может быть приятным, быстрым и удобным. Ставьте себя на место пользователя, когда делаете какой либо функционал, и спрашивайте "а пользовался бы я сам таким решением?".
В CodeLab Google подготовили набор советов, как сделать приложение удобнее и понятнее - Create a more polished user experience.
А также многое про удобство можно прочитать на сайте material.io - разделы Interaction и Communication очень детально и наглядно объясняют как можно создавать комфортное использование приложения. Многие принципы применимы не только на android, но и на любой системе с UI.
Изменения конфигурации
Некоторые конфигурации мобильных устройств могут измениться во время работы приложения. Это могут быть, например, ориентация экрана при повороте устройства пользователем, увеличение пользователем размера шрифта, смена локализации, смена темного режима на светлый и наоборот. В процессе создания приложения нужно помнить о необходимости обработки изменений конфигурации. Прочитайте документацию Google про обработку смены конфигурации.
Practice time
Сделать приложение по дизайну.
- Создать приложение с шаблона
Empty Activity
- Создать
data class Contact(val firstName: String, val lastName: String, val avatarResourceId: Int)
- Объявить глобальное свойство
contacts: List<Contact>
в котором написать 5 или больше разных контактов - это будут данные нашего приложения - Добавить 2 фрагмента -
ContactsFragment
иContactFragment
- На фрагменте
ContactsFragment
расположитьRecyclerView
отрисовывающий множество элементов - разные контакты - На фрагменте
ContactFragment
с помощьюConstraintLayout
сверстать UI экрана просмотра контакта - С помощью Android Navigation Component сделать переходы между списком и просмотром контакта
- Удостовериться в том, что приложение корректно обрабатывает смену конфигурации: локализации, темы, ориентации экрана, увеличение шрифта