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.
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 сделать переходы между списком и просмотром контакта