Navigation Component — bu nədir, NavHost və Navigation Graph

Müəllif: IT Sectr Dərc olunub: 2026-02-22 Oxuma vaxtı: 7 dəq

Navigation Component — proqramın ekranları arasında naviqasiyanı həyata keçirmək üçün Android Jetpack kitabxanası. Komponent fraqmentlər yığınının, dərin linklərin və arqumentlərin ötürülməsinin idarə edilməsini mərkəzləşdirir. 2018-ci ildən Jetpack-in tərkibinə daxildir və Google tərəfindən bütün yeni layihələr üçün tövsiyə olunur. Ətraflı məlumat üçün Google-ın rəsmi rəhbərliyinə baxın.

Əsas məqamlar

  • Navigation Component — Android ekranları arasında mərkəzləşdirilmiş naviqasiya üçün Jetpack kitabxanası
  • NavGraph — bütün ekranları və onlar arasındakı əlaqələri təsvir edən XML resursu
  • NavHostFragment — Activity layout-da cari naviqasiya ekranını göstərən konteyner
  • NavController — naviqasiyanı idarə edən obyekt: navigate, popBackStack, navigateUp
  • Safe Args — ekranlar arasında tip təhlükəsiz arqument ötürülməsi üçün Gradle plaqini

Navigation Component nədir?

Navigation Component — naviqasiya üçün vahid API təmin edən Android Jetpack (androidx.navigation) kitabxanası. Üç əsas elementi özündə birləşdirir: Navigation Graph (naviqasiya qrafı), NavHostFragment (ekranlar üçün konteyner) və NavController (keçid kontrolleri). Komponent avtomatik olaraq back stack-i idarə edir və deep links-i dəstəkləyir.

Navigation Component-dən əvvəl tərtibatçılar fraqmentləri FragmentManager vasitəsilə əl ilə idarə edirdilər. Bu, parçalanmış koda gətirib çıxarırdı: hər ekranın öz naviqasiya qaydaları var idi, back stack vəziyyətləri fərqlənirdi, deep links ayrıca tətbiq tələb edirdi. Navigation Component bu ssenariləri birləşdirdi. Google-un məlumatına görə (2026), kitabxana yeni Android layihələrinin 90%-nda quraşdırılıb.

Navigation Component digər Jetpack kitabxanaları ilə inteqrasiya olunur: LiveData, ViewModel, Material Design. Həm XML fraqmentlərini, həm də navigation-compose genişlənməsi vasitəsilə Jetpack Compose-u dəstəkləyir. Stabil buraxılış — 2.8.x (2025), minimum Android versiyası — API 14.

NavGraph — proqramın bütün ekranlarını və onlar arasındakı əlaqələri müəyyən edən XML resursu (res/navigation/nav_graph.xml). Hər bir ekran Fragment, Activity və ya Composable ola bilən düyündür (destination). Düyünlər arasındakı əlaqələr action adlanır və keçid istiqamətini təyin edir.

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="Ana"
        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="Təfərrüatlar"
        tools:layout="@layout/fragment_detail">
        <argument android:name="itemId"
            app:argType="integer"
            android:defaultValue="0" />
    </fragment>
</navigation>

startDestination atributu başlanğıcda göstərilən ilk ekranı təyin edir. Action hədəf destination-ı və isteğe bağlı animasiyaları müəyyən edir. Arqumentlər (argument) ekrana ötürülən parametrləri — tipi və standart dəyəri təsvir edir.

NavHostFragment — Activity layout-da yerləşdirilən və cari naviqasiya ekranını göstərən konteyner. NavHostFragment NavController.navigate() çağırıldıqda avtomatik olaraq fraqmentləri dəyişir. NavController — naviqasiyanı idarə edən obyekt: keçid, qayıdış, cari marşrutun yoxlanılması.

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-u AppBar ilə birləşdirir
        setupActionBarWithNavController(navController)
    }

    // Təfərrüat ekranına keçid
    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" — vacib atribut: sistemin "Geri" düyməsini ələ keçirir və idarəetməni NavController-a ötürür. NavigationUI — NavController-ı AppBar, BottomNavigationView, NavigationDrawer ilə əlaqələndirmək üçün vasitə. setupActionBarWithNavController iç-içə ekranlarda "Yuxarı" oxunu aktivləşdirir.

Navigation Component action-da və ya proqramlı şəkildə təyin olunan fərdi keçid animasiyalarını dəstəkləyir. Animasiyalar dörd atributla müəyyən edilir: enterAnim (yeni ekranın görünməsi), exitAnim (cari ekranın yox olması), popEnterAnim (qayıdışda görünmə) və popExitAnim (qayıdışda yox olma).

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>

// Animasiya ilə proqram keçidi
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)

Animasiyalar FragmentTransaction səviyyəsində Fragment ilə işləyir. Jetpack Compose üçün animasiyalar NavOptionsCompat vasitəsilə Compose Animation istifadə edilərək təyin olunur. Navigation Component animasiya növünə məhdudiyyət qoymur — translate, scale, alpha və onların kombinasiyaları dəstəklənir.

Safe Args: tip təhlükəsiz arqumentlər

Safe Args — ekranlar arasında tip təhlükəsiz məlumat ötürülməsi üçün Gradle plaqini. Plagin NavGraph-ı təhlil edir, spesifik tip sahələri olan Directions və Args siniflərini yaradır. Kompilyasiya mərhələsində tiplərin uyğunluğu yoxlanılır — MissingArgumentException xətası proqram işə salınmazdan əvvəl aşkar edilir.

kotlin
// build.gradle (module)
plugins {
    id 'androidx.navigation.safeargs.kotlin'
}

// Safe Args yaradır: DetailFragmentArgs, HomeFragmentDirections
// HomeFragment-də istifadə:
val action = HomeFragmentDirections
    .actionHomeToDetail(itemId = 42L)
findNavController().navigate(action)

// DetailFragment-də istifadə:
private val args: DetailFragmentArgs by navArgs()
// args.itemId Long tipindədir, null ötürülə bilməz

override fun onViewCreated(...) {
    super.onViewCreated(...)
    loadItem(args.itemId)
}

navArgs() — Fragment və ya Activity-də arqumentləri əldə etmək üçün Kotlin deleqatı. Plagin primitivləri, sətirləri, Parcelable, Serializable, Enum və massivləri dəstəkləyir. Mürəkkəb obyektlər üçün ViewModel və ya verilənlər bazasından yükləmə ilə ID ötürülməsindən istifadə edin.

Deep Link — proqramın konkret ekranını açan xarici keçid. Navigation Component deep link-ləri NavGraph-da app:deepLink atributu vasitəsilə idarə edir. Sistem hədəf ekrana qədər naviqasiya yığınını bərpa edən və ya proqram işə salınmayıbsa yeni yığın yaradan PendingIntent yaradır.

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-in proqram yaradılması
val pendingIntent = NavDeepLinkBuilder(context)
    .setGraph(R.navigation.nav_graph)
    .setDestination(R.id.profileFragment)
    .setArguments(Bundle().apply {
        putString("userId", "user_123")
    })
    .createPendingIntent()

Deep Links yolları və query parametrləri olan URI şablonlarını, intent action və mime tipini dəstəkləyir. Placeholder ({userId}) avtomatik olaraq destination arqumenti ilə uyğunlaşdırılır. Navigation Component həmçinin AndroidManifest vasitəsilə implicit deep link-ləri də idarə edir — NavHostFragment ilə Activity-ə intent-filter əlavə etmək kifayətdir.

Navigation Compose (androidx.navigation:navigation-compose) — Jetpack Compose üçün Navigation Component genişlənməsi. API NavController və NavHost konsepsiyasını qoruyur, lakin ekranlar Fragment əvəzinə Composable funksiyalarıdır. NavHost hər marşrut üçün composable lambda qəbul edir.

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 əvəzinə sətir marşrutlarından istifadə edir. Parametrlər route şablonu ("detail/{itemId}") vasitəsilə ötürülür və backStackEntry-dən çıxarılır. rememberNavController() rekompozisiya zamanı NavController-ı qoruyur. Compose-da Type Safety üçün navigation-compose-type-safety modulu tövsiyə olunur (eksperimental).

Tez-tez verilən suallar

Navigation Component-də NavHost nədir?

NavHost — naviqasiya ekranlarını göstərmək üçün konteyner. XML layout-da NavHostFragment vasitəsilə reallaşdırılır. NavHost NavGraph-də cari ekranı izləyir və keçidləri idarə edir. Hər Activity bir NavHostFragment ehtiva edir.

Safe Args Bundle-dən nə ilə fərqlənir?

Safe Args — tip təhlükəsiz arqument sinifləri yaradan Gradle plaqini. Bundle açarların və tiplərin əl ilə göstərilməsini tələb edir, bu da icra zamanı səhvlərə səbəb olur. Safe Args tipləri kompilyasiya mərhələsində yoxlayır və məlumatları avtomatik seriyalaşdırır.

Navigation Component vasitəsilə mürəkkəb obyektləri necə ötürmək olar?

Mürəkkəb obyektlər ViewModel (ekranlar üçün ümumi) və ya ID ötürülməsi ilə verilənlər bazası vasitəsilə ötürülür. Safe Args yalnız primitivləri, sətirləri və Parcelable-ı dəstəkləyir. Google naviqasiya arqumentləri vasitəsilə böyük obyektlərin ötürülməsindən çəkinməyi tövsiyə edir.

Navigation Component-də Deep Link necə işləyir?

Deep Link NavGraph-da app:deepLink atributu vasitəsilə konfiqurasiya olunur. Navigation Component daxil olan linkləri avtomatik idarə edir, NavDeepLinkBuilder vasitəsilə PendingIntent yaradır və naviqasiya yığınını hədəf ekrana qədər bərpa edir. URI, intent action və mime tipini dəstəkləyir.

Navigation Component-i Jetpack Compose ilə istifadə etmək olar?

Bəli. Navigation Compose (androidx.navigation:navigation-compose) Compose üçün NavHost təmin edir. API XML versiyasına bənzəyir, lakin ekranlar Composable funksiyalarıdır. NavController hər iki versiyada eyni şəkildə istifadə olunur. Google Compose-da yeni layihələr üçün Navigation Compose-u tövsiyə edir.

Nəticə

  • Navigation Component — NavController, NavHost və NavGraph ilə mərkəzləşdirilmiş naviqasiya üçün Android Jetpack kitabxanası
  • NavGraph — bütün ekranları (destination) və onlar arasındakı əlaqələri (action) təsvir edən XML qrafı
  • NavHostFragment — "Geri" düyməsi üçün defaultNavHost atributunu dəstəkləyən Activity layout konteyneri
  • Safe Args — kompilyasiya mərhələsində tip yoxlaması ilə təhlükəsiz arqument ötürülməsi üçün Gradle plaqini
  • Deep Links naviqasiya yığınının avtomatik bərpası ilə URI, intent action və mime tipini dəstəkləyir
  • Navigation Compose — sətir marşrutları və composable ekranları ilə Jetpack Compose üçün genişlənmə
  • Navigation Component Google tərəfindən yeni Android layihələrində tövsiyə edilən yeganə naviqasiya üsuludur

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et

Həm də oxuyun