Navigation Component — Android Jetpack библиотека за имплементацију навигације између екрана апликације. Компонента централизује управљање стеком фрагмената, дубоким линковима и преносом аргумената. Део је Jetpack-а од 2018. године и препоручује је Google за све нове пројекте. Детаљније прочитајте у званичном Google водичу.
Главне ствари
Navigation Component — Android Jetpack библиотека (androidx.navigation) која пружа јединствени API за навигацију. Садржи три кључна елемента: Navigation Graph (граф навигације), NavHostFragment (контејнер за екране) и NavController (контролер прелаза). Компонента аутоматски управља back стеком и подржава deep link-ове.
Пре Navigation Component-а, програмери су ручно управљали фрагментима преко FragmentManager-а. То је доводило до фрагментираног кода: сваки екран је имао своја правила навигације, стања back стека су се разликовала, deep link-ови су захтевали одвојену имплементацију. Navigation Component је објединио ове сценарије. Према Google-у (2026), библиотека је инсталирана у 90% нових Android пројеката.
Navigation Component се интегрише са другим Jetpack библиотекама: LiveData, ViewModel, Material Design. Подржава и XML фрагменте и Jetpack Compose кроз проширење navigation-compose. Стабилно издање — 2.8.x (2025), минимална Android верзија — API 14.
NavGraph — XML ресурс (res/navigation/nav_graph.xml) који дефинише све екране апликације и везе између њих. Сваки екран је чвор (destination) који може бити Fragment, Activity или Composable. Везе између чворова су action, које одређују правац прелаза.
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
app:startDestination="@+id/homeFragment">
<fragment
android:id="@+id/homeFragment"
android:name=".HomeFragment"
android:label="Почетна"
tools:layout="@layout/fragment_home">
<action
android:id="@+id/action_home_to_detail"
app:destination="@+id/detailFragment"
app:enterAnim="@anim/slide_in_right"
app:exitAnim="@anim/slide_out_left"
app:popEnterAnim="@anim/slide_in_left"
app:popExitAnim="@anim/slide_out_right" />
</fragment>
<fragment
android:id="@+id/detailFragment"
android:name=".DetailFragment"
android:label="Детаљи"
tools:layout="@layout/fragment_detail">
<argument android:name="itemId"
app:argType="integer"
android:defaultValue="0" />
</fragment>
</navigation>Атрибут startDestination поставља први екран који се приказује при покретању. Action дефинише циљни destination и опционе анимације. Аргументи (argument) описују параметре који се преносе на екран — тип и подразумевану вредност.
NavHostFragment — контејнер који се поставља у layout Activity-ја и приказује тренутни екран навигације. NavHostFragment аутоматски мења фрагменте при позиву NavController.navigate(). NavController — објекат који управља навигацијом: прелаз, повратак, провера тренутне руте.
// Layout Activity: activity_main.xml
// <androidx.fragment.app.FragmentContainerView
// android:id="@+id/nav_host_fragment"
// android:name="androidx.navigation.fragment.NavHostFragment"
// app:navGraph="@navigation/nav_graph"
// app:defaultNavHost="true" />
class MainActivity : AppCompatActivity() {
private val navController by lazy {
(findViewById<NavHostFragment>(R.id.nav_host_fragment))
.navController
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// NavigationUI повезује NavController са AppBar
setupActionBarWithNavController(navController)
}
// Прелаз на екран детаља
fun openDetail(itemId: Long) {
val bundle = Bundle().apply {
putLong("itemId", itemId)
}
navController.navigate(R.id.action_home_to_detail, bundle)
}
override fun onSupportNavigateUp() =
navController.navigateUp() || super.onSupportNavigateUp()
}app:defaultNavHost="true" — важан атрибут: пресреће системско дугме „Назад" и прослеђује контролу NavController-у. NavigationUI — алат за повезивање NavController-а са AppBar, BottomNavigationView, NavigationDrawer. setupActionBarWithNavController укључује стрелицу „Горе" на угњежденим екранима.
Navigation Component подржава прилагођене анимације прелаза, дефинисане у action-у или програмски. Анимације се дефинишу са четири атрибута: enterAnim (појава новог екрана), exitAnim (нестајање тренутног), popEnterAnim (појава при повратку) и popExitAnim (нестајање при повратку).
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromXDelta="100%"
android:toXDelta="0%"
android:duration="300" />
</set>
// Програмски прелаз са анимацијом
val navOptions = NavOptions.Builder()
.setEnterAnim(R.anim.slide_in_right)
.setExitAnim(R.anim.slide_out_left)
.setPopEnterAnim(R.anim.slide_in_left)
.setPopExitAnim(R.anim.slide_out_right)
.build()
navController.navigate(R.id.detailFragment, args, navOptions)Анимације раде са Fragment на нивоу FragmentTransaction. За Jetpack Compose анимације се задају кроз NavOptionsCompat коришћењем Compose Animation. Navigation Component не намеће ограничења на тип анимације — подржава translate, scale, alpha и њихове комбинације.
Safe Args — Gradle прикључак за тип-безбедан пренос података између екрана. Прикључак анализира NavGraph, генерише класе Directions и Args са конкретним типовима поља. У фази компилације проверава се усаглашеност типова — грешка MissingArgumentException се открива пре покретања апликације.
// build.gradle (module)
plugins {
id 'androidx.navigation.safeargs.kotlin'
}
// Safe Args генерише: DetailFragmentArgs, HomeFragmentDirections
// Коришћење у HomeFragment:
val action = HomeFragmentDirections
.actionHomeToDetail(itemId = 42L)
findNavController().navigate(action)
// Коришћење у DetailFragment:
private val args: DetailFragmentArgs by navArgs()
// args.itemId има тип Long, null не може бити прослеђен
override fun onViewCreated(...) {
super.onViewCreated(...)
loadItem(args.itemId)
}navArgs() — Kotlin делегат за добијање аргумената у Fragment-у или Activity-ју. Прикључак подржава примитиве, стрингове, Parcelable, Serializable, Enum и низове. За сложене објекте користите пренос ID-ја са учитавањем из ViewModel-а или базе података.
Deep Link — спољни линк који отвара одређени екран апликације. Navigation Component обрађује deep link-ове кроз атрибут app:deepLink у NavGraph-у. Систем креира PendingIntent који обнавља стек навигације до циљног екрана или креира нови стек ако апликација није покренута.
<fragment android:id="@+id/profileFragment"
android:name=".ProfileFragment">
<deepLink
app:uri="https://example.com/profile/{userId}" />
<argument
android:name="userId"
app:argType="string" />
</fragment>
// Програмско креирање Deep Link
val pendingIntent = NavDeepLinkBuilder(context)
.setGraph(R.navigation.nav_graph)
.setDestination(R.id.profileFragment)
.setArguments(Bundle().apply {
putString("userId", "user_123")
})
.createPendingIntent()Deep Link-ови подржавају URI шаблоне са путањама и query параметрима, intent action и mime type. Placeholder ({userId}) се аутоматски повезује са аргументом destination. Navigation Component такође обрађује имплицитне deep link-ове кроз AndroidManifest — довољно је додати intent-filter Activity-ју са NavHostFragment-ом.
Navigation Compose (androidx.navigation:navigation-compose) — проширење Navigation Component-а за Jetpack Compose. API задржава концепт NavController и NavHost, али су екрани Composable функције уместо Fragment-а. NavHost прима composable ламбду за сваку руту.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
MyAppTheme {
val navController = rememberNavController()
NavHost(
navController = navController,
startDestination = "home"
) {
composable("home") {
HomeScreen(
onItemClick = { id ->
navController.navigate("detail/$id")
}
)
}
composable(
route = "detail/{itemId}",
arguments = listOf(
navArgument("itemId") {
type = NavType.LongType
}
)
) { backStackEntry ->
val itemId = backStackEntry
.arguments?.getLong("itemId") ?: 0L
DetailScreen(itemId = itemId)
}
}
}
}
}
}Navigation Compose користи стринг руте уместо id. Параметри се преносе кроз шаблон руте ("detail/{itemId}") и извлаче се из backStackEntry. rememberNavController() чува NavController при рекомпозицији. За Type Safety у Compose-у препоручује се модул navigation-compose-type-safety (експериментални).
Често постављана питања
NavHost — контејнер за приказ екрана навигације. Имплементира се кроз NavHostFragment у XML layout-у. NavHost прати тренутни екран у NavGraph-у и управља прелазима. Свако Activity садржи један NavHostFragment.
Safe Args — Gradle прикључак који генерише тип-безбедне класе аргумената. Bundle захтева ручно навођење кључева и типова, што доводи до грешака у извршавању. Safe Args проверава типове у фази компилације и аутоматски серијализује податке.
Сложени објекти се преносе кроз ViewModel (заједнички за екране) или кроз базу података са преносом ID-ја. Safe Args подржава само примитиве, стрингове и Parcelable. Google препоручује избегавање преноса великих објеката кроз аргументе навигације.
Deep Link се конфигурише у NavGraph-у кроз атрибут app:deepLink. Navigation Component аутоматски обрађује долазне линкове, креира PendingIntent кроз NavDeepLinkBuilder и обнавља стек навигације до циљног екрана. Подржава URI, intent action и mime type.
Да. Navigation Compose (androidx.navigation:navigation-compose) пружа NavHost за Compose. API је аналоган XML верзији, али су екрани Composable функције. NavController се користи идентично у обе верзије. Google препоручује Navigation Compose за нове пројекте у Compose.
Закључак
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође