Помимо Activity, как ещё можно открыть экраны в Android приложении?
В Android-приложениях экран — это не всегда Activity. Помимо Activity, есть несколько способов организовать и открывать экраны:
1. Фрагменты (Fragment)
Фрагменты — это модульные части интерфейса, которые встраиваются в Activity. Один Activity может содержать один или несколько фрагментов. Это основной способ навигации внутри одного экрана.
Как открыть фрагмент:
supportFragmentManager.beginTransaction()
.replace(R.id.container, MyFragment())
.addToBackStack(null)
.commit()
Преимущества:
-
Переработка интерфейса без пересоздания Activity.
-
Поддержка вложенной навигации.
-
Возможность адаптации под разные размеры экранов (планшеты, foldable и т.п.).
2. Диалоги (Dialog, DialogFragment)
Всплывающие окна, которые можно считать отдельными "экранами" для подтверждений, ввода данных, выбора и т.п.
val dialog = MyDialogFragment()
dialog.show(supportFragmentManager, "dialog_tag")
3. Навигация через Jetpack Navigation
Jetpack Navigation Component — современная библиотека для декларативной навигации, работает с фрагментами и активити, но экраны определяются как destinations, которые могут быть:
-
Фрагментами
-
Диалогами
-
Действиями (deep link)
-
Nested графами
<navigation ...>
<fragment
android:id="@+id/mainFragment"
android:name="com.example.MainFragment" />
</navigation>
Навигация:
findNavController().navigate(R.id.toDetailsFragment)
4. BottomSheet (модальные и постоянные)
Полноэкранные или частичные экраны, выезжающие снизу — особенно актуальны для UI по стандарту Material Design.
class MyBottomSheet : BottomSheetDialogFragment() {
// ваш экран
}
5. Custom Views или View-based экраны
Можно создать один Activity и переключать экраны как наборы View, ViewGroup, ConstraintSet, MotionLayout, или использовать ViewFlipper, ViewPager2, RecyclerView.
Пример — реализация с ViewPager2:
viewPager.adapter = ScreenAdapter()
viewPager.setCurrentItem(1, true)
Это используется, например, при реализации Onboarding-экранов или swipe-навигаторов.
6. Compose Navigation (Jetpack Compose)
В Jetpack Compose нет фрагментов. Вместо них используются Composable-функции, и переход между экранами осуществляется через NavController:
NavHost(navController, startDestination = "home") {
composable("home") { HomeScreen() }
composable("details") { DetailsScreen() }
}
Навигация:
navController.navigate("details")
7. Системные элементы: Notifications, App Widgets, PendingIntent
Они могут запускать экран из контекста вне приложения, часто через PendingIntent, но это всегда Activity.
Однако если мыслить шире, то можно открыть "экран" как:
-
Heads-up уведомление
-
Интерактивный элемент на рабочем столе (widget)
-
Служебный UI (например, через Accessibility Service)
8. Вебвью (WebView) как "встроенный экран"
Можно создать один Activity, который отображает разные страницы через WebView. Это не "настоящие" экраны, но визуально они могут так восприниматься.
🧠 Когда не использовать Activity для каждого экрана
Создавать отдельную Activity для каждого экрана — устаревший подход, нарушающий:
-
управление back stack'ом;
-
разделение логики;
-
плавность навигации;
-
переиспользование UI.
Современный Android предпочитает одно Activity + множество фрагментов (или composable-функций).
Таким образом, в Android экран — это абстракция, которую можно реализовать через фрагмент, composable, диалог, bottom sheet, WebView, кастомный view-контейнер или даже системный элемент. Главное — это не тип компонента, а UX-нагрузка, которую он несёт.