Navigation Component — шта је то, NavHost и Navigation Graph

Аутор: IT Sectr Објављено: 2026-02-22 Време читања: 7 мин

Navigation Component — Android Jetpack библиотека за имплементацију навигације између екрана апликације. Компонента централизује управљање стеком фрагмената, дубоким линковима и преносом аргумената. Део је Jetpack-а од 2018. године и препоручује је Google за све нове пројекте. Детаљније прочитајте у званичном Google водичу.

Главне ствари

  • Navigation Component — Jetpack библиотека за централизовану навигацију између Android екрана
  • NavGraph — XML ресурс који описује све екране и везе између њих
  • NavHostFragment — контејнер у layout Activity-ја који приказује тренутни екран навигације
  • NavController — објекат за управљање навигацијом: navigate, popBackStack, navigateUp
  • Safe Args — Gradle прикључак за тип-безбедан пренос аргумената између екрана

Шта је Navigation Component?

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, које одређују правац прелаза.

xml

<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 — објекат који управља навигацијом: прелаз, повратак, провера тренутне руте.

kotlin
// 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

<?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: тип-безбедни аргументи

Safe Args — Gradle прикључак за тип-безбедан пренос података између екрана. Прикључак анализира NavGraph, генерише класе Directions и Args са конкретним типовима поља. У фази компилације проверава се усаглашеност типова — грешка MissingArgumentException се открива пре покретања апликације.

kotlin
// 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 који обнавља стек навигације до циљног екрана или креира нови стек ако апликација није покренута.

xml

<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 ламбду за сваку руту.

kotlin
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 у Navigation Component?

NavHost — контејнер за приказ екрана навигације. Имплементира се кроз NavHostFragment у XML layout-у. NavHost прати тренутни екран у NavGraph-у и управља прелазима. Свако Activity садржи један NavHostFragment.

По чему је Safe Args бољи од Bundle?

Safe Args — Gradle прикључак који генерише тип-безбедне класе аргумената. Bundle захтева ручно навођење кључева и типова, што доводи до грешака у извршавању. Safe Args проверава типове у фази компилације и аутоматски серијализује податке.

Како пренети сложене објекте кроз Navigation Component?

Сложени објекти се преносе кроз ViewModel (заједнички за екране) или кроз базу података са преносом ID-ја. Safe Args подржава само примитиве, стрингове и Parcelable. Google препоручује избегавање преноса великих објеката кроз аргументе навигације.

Како функционише Deep Link у Navigation Component?

Deep Link се конфигурише у NavGraph-у кроз атрибут app:deepLink. Navigation Component аутоматски обрађује долазне линкове, креира PendingIntent кроз NavDeepLinkBuilder и обнавља стек навигације до циљног екрана. Подржава URI, intent action и mime type.

Може ли се Navigation Component користити са Jetpack Compose?

Да. Navigation Compose (androidx.navigation:navigation-compose) пружа NavHost за Compose. API је аналоган XML верзији, али су екрани Composable функције. NavController се користи идентично у обе верзије. Google препоручује Navigation Compose за нове пројекте у Compose.

Закључак

  • Navigation Component — Android Jetpack библиотека за централизовану навигацију са NavController, NavHost и NavGraph
  • NavGraph — XML граф који описује све екране (destination) и везе (action) између њих
  • NavHostFragment — контејнер у layout Activity-ја који подржава атрибут defaultNavHost за дугме „Назад"
  • Safe Args — Gradle прикључак за тип-безбедан пренос аргумената са провером типова у фази компилације
  • Deep Links подржава URI, intent action и mime type са аутоматским обнављањем стека навигације
  • Navigation Compose — проширење за Jetpack Compose са стринг рутама и composable екранима
  • Navigation Component је једини Google-ом препоручени начин навигације у новим Android пројектима

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође