Как проектировать экраны в Android Studio и делать их адаптивными
Короткий ответ: Activity — контейнер и точка навигации; Fragment — переиспользуемый UI-блок; для адаптации используйте ConstraintLayout, resource qualifiers (sw600dp, layout‑land), dimens и отдельные layout‑файлы для планшетов/ориентаций. Ниже — практическая инструкция шаг за шагом.
Activity vs Fragment: ответственность и когда что выбирать
- Activity — инициализирует каркас: Toolbar, BottomNavigation, NavHostFragment, обрабатывает Intent, разрешения и системные callbacks. Создавайте новую Activity, когда нужен отдельный навигационный стек, другая тема/окно или независимая точка входа (deep link, результат из другого приложения).
- Fragment — экранный блок с собственной логикой и ViewModel; подходит для переиспользования, динамической перестановки в одном Activity (вкладки, мастер‑шаги, master–detail). На планшетах комбинируйте несколько Fragment в одном Activity.
Короткий чек-лист:
- Нужен самостоятельный стек/тема/точка входа → Activity.
- Нужна перестановка блоков/повторное использование в разных контейнерах → Fragment.
Подход «одна Activity — много Fragment» упрощает навигацию и поддержку, особенно с Jetpack Navigation.
Разметка и Layout Editor: лучшие практики
- Корень экрана: ConstraintLayout — минимальная вложенность, гибкие constraints, chains, guidelines и barriers.
- Для списков используйте RecyclerView (а не ScrollView с набором view).
- FrameLayout / FragmentContainerView — контейнеры под Fragment/оверлеи.
- LinearLayout — для простых строк/малых блоков, но не для сложных экранов.
- В редакторе: работайте в Design для быстрой расстановки, в Code — для точного контроля margins, styles и повторного использования.
- Обязательные правила:
- Используйте 0dp (match_constraints) для растягиваемых элементов в ConstraintLayout.
- Привязывайте элементы по baseline/center/edges; исправляйте предупреждения «Not constrained…».
- Вынесите размеры, отступы и цвета в values (styles, dimens).
- Шрифты — в sp, отступы и размеры — в dp.
Практический приём: создайте отдельный layout для каждого Fragment, а Activity держит только контейнер(ы) и общие элементы интерфейса.
Адаптация под размеры и ориентации
- Ресурсные каталоги:
- res/layout/ — базовая разметка.
- res/layout-sw600dp/ — планшеты (ширина ≥600dp).
- res/layout-land/ — альбомная ориентация.
- res/values-sw600dp/dimens.xml — увеличенные отступы/размеры.
- Изображения: отдавайте предпочтение VectorDrawable; если растровые — кладите в density‑папки.
- Всегда используйте dp и sp; не применяйте px.
- Master–detail паттерн: в res/layout/activity_main.xml — один FragmentContainerView; в res/layout-sw600dp/activity_main.xml — два рядом (список + детали).
- Тестирование: Device Preview в Android Studio, эмуляторы разных форм‑факторов и хотя бы одно реальное устройство. Проверяйте системный масштаб шрифтов и поведение при нехватке места.
Типичная ошибка — верстать под один эмулятор. На другом устройстве текст может обрезаться, кнопки уйдут за экран.
Частые ошибки
- Глубокая вложенность view → тормоза; замените на ConstraintLayout или оптимизируйте.
- Жёсткие размеры в layout вместо dimens и match_constraints.
- Игнорирование accessibility: не масштабируете шрифты, не проверяете contentDescription.
- Отсутствие альтернативных layout для sw600dp/land.
FAQ
- Нужно ли делать всё в одной Activity? Нет — выбирайте подход в зависимости от навигации и сложности. «Одна Activity» удобна с Navigation Component.
- Как хранить общие стили? В styles.xml и themes; размеры — в dimens.xml.
- Как проверить планшетную разметку? Используйте layout-sw600dp и Device Preview + эмуляторы.
- Что быстрее: VectorDrawable или PNG? Vector более универсален и масштабируем; PNG нужен при сложной графике или поддержке очень старых API.
Заключение: проектируйте экран как набор переиспользуемых блоков (Fragment) внутри каркаса (Activity), используйте ConstraintLayout и ресурсы с qualifiers для адаптации. Так интерфейс будет поддерживаемым и корректно отображаться на телефонах и планшетах.