Navigation Component — bu nima, NavHost va Navigation Graph

Muallif: IT Sectr Nashr etilgan: 2026-02-22 O'qish vaqti: 7 daq

Navigation Component — ilova ekranlari o'rtasida navigatsiyani amalga oshirish uchun Android Jetpack kutubxonasi. Komponent fragmentlar stekini, chuqur havolalarni va argumentlarni uzatishni boshqarishni markazlashtiradi. 2018-yildan beri Jetpack tarkibiga kiradi va Google tomonidan barcha yangi loyihalar uchun tavsiya etiladi. Batafsil ma'lumot uchun Google rasmiy qo'llanmasiga qarang.

Asosiy ma'lumotlar

  • Navigation Component — Android ekranlari o'rtasida markazlashtirilgan navigatsiya uchun Jetpack kutubxonasi
  • NavGraph — barcha ekranlar va ular orasidagi bog'lanishlarni tavsiflovchi XML resurs
  • NavHostFragment — Activity layout-da joriy navigatsiya ekranini ko'rsatadigan konteyner
  • NavController — navigatsiyani boshqarish obyekti: navigate, popBackStack, navigateUp
  • Safe Args — ekranlar o'rtasida tip-xavfsiz argument uzatish uchun Gradle plagini

Navigation Component nima?

Navigation Component — navigatsiya uchun yagona API ta'minlovchi Android Jetpack (androidx.navigation) kutubxonasi. Uchta asosiy elementni o'z ichiga oladi: Navigation Graph (navigatsiya grafi), NavHostFragment (ekranlar uchun konteyner) va NavController (o'tish kontrolleri). Komponent avtomatik ravishda back stack-ni boshqaradi va deep links-ni qo'llab-quvvatlaydi.

Navigation Component-dan oldin dasturchilar fragmentlarni FragmentManager orqali qo'lda boshqarardilar. Bu parchalangan kodga olib keldi: har bir ekran o'z navigatsiya qoidalariga ega edi, back stack holatlari farq qilardi, deep links alohida amalga oshirishni talab qilardi. Navigation Component bu stsenariylarni birlashtirdi. Google ma'lumotlariga ko'ra (2026), kutubxona yangi Android loyihalarining 90 foizida o'rnatilgan.

Navigation Component boshqa Jetpack kutubxonalari bilan integratsiyalanadi: LiveData, ViewModel, Material Design. XML fragmentlarni ham, navigation-compose kengaytmasi orqali Jetpack Compose-ni ham qo'llab-quvvatlaydi. Barqaror versiya — 2.8.x (2025), minimal Android versiyasi — API 14.

NavGraph — ilovaning barcha ekranlari va ular orasidagi bog'lanishlarni belgilaydigan XML resurs (res/navigation/nav_graph.xml). Har bir ekran Fragment, Activity yoki Composable bo'lishi mumkin bo'lgan tugun (destination) hisoblanadi. Tugunlar orasidagi bog'lanishlar action deb ataladi va o'tish yo'nalishini belgilaydi.

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="Bosh sahifa"
        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="Tafsilotlar"
        tools:layout="@layout/fragment_detail">
        <argument android:name="itemId"
            app:argType="integer"
            android:defaultValue="0" />
    </fragment>
</navigation>

startDestination atributi ishga tushirilganda ko'rsatiladigan birinchi ekranni belgilaydi. Action maqsadli destination-ni va ixtiyoriy animatsiyalarni aniqlaydi. Argumentlar (argument) ekranga uzatiladigan parametrlarni — turi va standart qiymatini tavsiflaydi.

NavHostFragment — Activity layout-iga joylashtiriladigan va joriy navigatsiya ekranini ko'rsatadigan konteyner. NavHostFragment NavController.navigate() chaqirilganda avtomatik ravishda fragmentlarni almashtiradi. NavController — navigatsiyani boshqaradigan obyekt: o'tish, qaytish, joriy marshrutni tekshirish.

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-ni AppBar bilan bog'laydi
        setupActionBarWithNavController(navController)
    }

    // Tafsilot ekraniga o'tish
    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" — muhim atribut: tizimning "Orqaga" tugmasini ushlab qoladi va boshqaruvni NavController-ga uzatadi. NavigationUI — NavController-ni AppBar, BottomNavigationView, NavigationDrawer bilan bog'lash vositasi. setupActionBarWithNavController ichki ekranlarda "Yuqoriga" strelkasini faollashtiradi.

Navigation Component action-da yoki dasturiy ravishda belgilanadigan maxsus o'tish animatsiyalarini qo'llab-quvvatlaydi. Animatsiyalar to'rtta atribut bilan aniqlanadi: enterAnim (yangi ekranning paydo bo'lishi), exitAnim (joriy ekranning yo'qolishi), popEnterAnim (qaytishda paydo bo'lish) va popExitAnim (qaytishda yo'qolish).

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>

// Animatsiya bilan dasturiy o'tish
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)

Animatsiyalar FragmentTransaction darajasida Fragment bilan ishlaydi. Jetpack Compose uchun animatsiyalar NavOptionsCompat orqali Compose Animation yordamida belgilanadi. Navigation Component animatsiya turiga cheklov qo'ymaydi — translate, scale, alpha va ularning kombinatsiyalari qo'llab-quvvatlanadi.

Safe Args: tip-xavfsiz argumentlar

Safe Args — ekranlar o'rtasida tip-xavfsiz ma'lumot uzatish uchun Gradle plagini. Plagin NavGraph-ni tahlil qiladi, aniq tur maydonlariga ega Directions va Args sinflarini yaratadi. Kompilyatsiya bosqichida turlarning mosligi tekshiriladi — MissingArgumentException xatosi ilova ishga tushirilishidan oldin aniqlanadi.

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

// Safe Args yaratadi: DetailFragmentArgs, HomeFragmentDirections
// HomeFragment-da ishlatish:
val action = HomeFragmentDirections
    .actionHomeToDetail(itemId = 42L)
findNavController().navigate(action)

// DetailFragment-da ishlatish:
private val args: DetailFragmentArgs by navArgs()
// args.itemId Long turiga ega, null uzatilmaydi

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

navArgs() — Fragment yoki Activity-da argumentlarni olish uchun Kotlin delegati. Plagin primitivlarni, satrlarni, Parcelable, Serializable, Enum va massivlarni qo'llab-quvvatlaydi. Murakkab obyektlar uchun ViewModel yoki ma'lumotlar bazasidan yuklash bilan ID uzatishdan foydalaning.

Deep Link — ilovaning muayyan ekranini ochadigan tashqi havola. Navigation Component deep link-larni NavGraph-dagi app:deepLink atributi orqali boshqaradi. Tizim maqsadli ekrangacha navigatsiya stekini tiklaydigan yoki ilova ishga tushirilmagan bo'lsa yangi stek yaratadigan PendingIntent yaratadi.

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

Deep Links yo'llar va query parametrlari bilan URI shablonlarini, intent action va mime type-ni qo'llab-quvvatlaydi. Placeholder ({userId}) avtomatik ravishda destination argumenti bilan moslashtiriladi. Navigation Component shuningdek AndroidManifest orqali implicit deep link-larni ham boshqaradi — NavHostFragment bilan Activity-ga intent-filter qo'shish kifoya.

Navigation Compose (androidx.navigation:navigation-compose) — Jetpack Compose uchun Navigation Component kengaytmasi. API NavController va NavHost kontseptsiyasini saqlaydi, lekin ekranlar Fragment o'rniga Composable funksiyalardir. NavHost har bir marshrut uchun composable lambda qabul qiladi.

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 o'rniga satr marshrutlaridan foydalanadi. Parametrlar route shabloni ("detail/{itemId}") orqali uzatiladi va backStackEntry-dan olinadi. rememberNavController() rekompozitsiya vaqtida NavController-ni saqlaydi. Compose-da Type Safety uchun navigation-compose-type-safety moduli tavsiya etiladi (eksperimental).

Tez-tez so'raladigan savollar

Navigation Component-da NavHost nima?

NavHost — navigatsiya ekranlarini ko'rsatish uchun konteyner. XML layout-da NavHostFragment orqali amalga oshiriladi. NavHost NavGraph-dagi joriy ekranni kuzatib boradi va o'tishlarni boshqaradi. Har bir Activity bitta NavHostFragment-ni o'z ichiga oladi.

Safe Args Bundle-dan qanday farq qiladi?

Safe Args — tip-xavfsiz argument sinflarini yaratadigan Gradle plagini. Bundle kalitlar va turlarni qo'lda ko'rsatishni talab qiladi, bu esa ish vaqtida xatolarga olib keladi. Safe Args turlarni kompilyatsiya bosqichida tekshiradi va ma'lumotlarni avtomatik ravishda seriyalashtiradi.

Navigation Component orqali murakkab obyektlarni qanday uzatish mumkin?

Murakkab obyektlar ViewModel (ekranlar uchun umumiy) yoki ID uzatish bilan ma'lumotlar bazasi orqali uzatiladi. Safe Args faqat primitivlar, satrlar va Parcelable-ni qo'llab-quvvatlaydi. Google navigatsiya argumentlari orqali katta obyektlarni uzatishdan qochishni tavsiya qiladi.

Navigation Component-da Deep Link qanday ishlaydi?

Deep Link NavGraph-da app:deepLink atributi orqali sozlanadi. Navigation Component kiruvchi havolalarni avtomatik boshqaradi, NavDeepLinkBuilder orqali PendingIntent yaratadi va navigatsiya stekini maqsadli ekrangacha tiklaydi. URI, intent action va mime type-ni qo'llab-quvvatlaydi.

Navigation Component-ni Jetpack Compose bilan ishlatish mumkinmi?

Ha. Navigation Compose (androidx.navigation:navigation-compose) Compose uchun NavHost-ni taqdim etadi. API XML versiyasiga o'xshaydi, lekin ekranlar Composable funksiyalardir. NavController ikkala versiyada ham bir xil ishlatiladi. Google Compose-da yangi loyihalar uchun Navigation Compose-ni tavsiya qiladi.

Xulosa

  • Navigation Component — NavController, NavHost va NavGraph bilan markazlashtirilgan navigatsiya uchun Android Jetpack kutubxonasi
  • NavGraph — barcha ekranlarni (destination) va ular orasidagi bog'lanishlarni (action) tavsiflovchi XML grafi
  • NavHostFragment — "Orqaga" tugmasi uchun defaultNavHost atributini qo'llab-quvvatlaydigan Activity layout konteyneri
  • Safe Args — kompilyatsiya bosqichida tip tekshiruvi bilan xavfsiz argument uzatish uchun Gradle plagini
  • Deep Links navigatsiya stekining avtomatik tiklanishi bilan URI, intent action va mime type-ni qo'llab-quvvatlaydi
  • Navigation Compose — satr marshrutlari va composable ekranlari bilan Jetpack Compose uchun kengaytma
  • Navigation Component Google tomonidan yangi Android loyihalarida tavsiya etiladigan yagona navigatsiya usulidir

Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz

IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.

Loyihani muhokama qilish

Shuningdek o'qing