Navigation Component — Nedir, NavHost ve Navigation Graph

Yazar: IT Sectr Yayınlanma: 2026-02-22 Okuma süresi: 7 dk

Navigation Component, uygulama ekranları arasında gezinmeyi uygulamak için bir Android Jetpack kitaplığıdır. Bileşen, parça yığınının, derin bağlantıların ve argüman aktarımının yönetimini merkezileştirir. 2018'den beri Jetpack'in bir parçasıdır ve Google tarafından tüm yeni projeler için önerilir. Daha fazla bilgi için Google resmi kılavuzuna bakın.

Önemli Noktalar

  • Navigation Component — Android ekranları arasında merkezi navigasyon için Jetpack kitaplığı
  • NavGraph — tüm ekranları ve aralarındaki bağlantıları tanımlayan XML kaynağı
  • NavHostFragment — Activity düzeninde geçerli navigasyon ekranını görüntüleyen kapsayıcı
  • NavController — navigasyon kontrol nesnesi: navigate, popBackStack, navigateUp
  • Safe Args — ekranlar arasında tür güvenli argüman aktarımı için Gradle eklentisi

Navigation Component Nedir?

Navigation Component, navigasyon için birleşik bir API sağlayan bir Android Jetpack kitaplığıdır (androidx.navigation). Üç temel öğe içerir: Navigation Graph (navigasyon grafiği), NavHostFragment (ekran kapsayıcısı) ve NavController (geçiş denetleyicisi). Bileşen, geri yığınını otomatik olarak yönetir ve derin bağlantıları destekler.

Navigation Component'ten önce geliştiriciler, parçaları FragmentManager aracılığıyla manuel olarak yönetiyordu. Bu, parçalanmış koda yol açtı: her ekranın kendi navigasyon kuralları vardı, geri yığını durumları farklılık gösteriyordu ve derin bağlantılar ayrı bir uygulama gerektiriyordu. Navigation Component bu senaryoları birleştirdi. Google'a (2026) göre, kitaplık yeni Android projelerinin %90'ında yüklüdür.

Navigation Component diğer Jetpack kitaplıklarıyla entegre olur: LiveData, ViewModel, Material Design. Hem XML parçalarını hem de navigation-compose uzantısı aracılığıyla Jetpack Compose'u destekler. Kararlı sürüm — 2.8.x (2025), minimum Android sürümü — API 14.

NavGraph, uygulamanın tüm ekranlarını ve aralarındaki bağlantıları tanımlayan bir XML kaynağıdır (res/navigation/nav_graph.xml). Her ekran bir hedef (destination) olup Fragment, Activity veya Composable olabilir. Hedefler arasındaki bağlantılar, geçiş yönünü tanımlayan eylemlerdir (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="Ana Sayfa"
        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="Detaylar"
        tools:layout="@layout/fragment_detail">
        <argument android:name="itemId"
            app:argType="integer"
            android:defaultValue="0" />
    </fragment>
</navigation>

startDestination özelliği, başlangıçta görüntülenen ilk ekranı belirler. Bir eylem, hedef hedefi ve isteğe bağlı animasyonları tanımlar. Argümanlar, ekrana iletilen parametreleri (tür ve varsayılan değer) açıklar.

NavHostFragment, Activity düzenine yerleştirilen ve geçerli navigasyon ekranını görüntüleyen bir kapsayıcıdır. NavController.navigate() çağrıldığında NavHostFragment otomatik olarak parçaları değiştirir. NavController, navigasyonu yöneten nesnedir: geçişler, geri dönüş ve mevcut rotanın kontrolü.

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'a bağlar
        setupActionBarWithNavController(navController)
    }

    // Detay ekranına git
    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" önemli bir özelliktir: sistem Geri düğmesini yakalar ve kontrolü NavController'a devreder. NavigationUI, NavController'ı AppBar, BottomNavigationView, NavigationDrawer ile bağlamak için bir yardımcı programdır. setupActionBarWithNavController, iç içe ekranlarda Geri okunu etkinleştirir.

Navigation Component, eylemlerde veya programatik olarak ayarlanan özel geçiş animasyonlarını destekler. Animasyonlar dört özellikle tanımlanır: enterAnim (yeni ekranın görünmesi), exitAnim (mevcut ekranın kaybolması), popEnterAnim (geri dönerken görünme) ve popExitAnim (geri dönerken kaybolma).

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>

// Animasyonlu programatik geçiş
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)

Animasyonlar, FragmentTransaction düzeyinde Fragment ile çalışır. Jetpack Compose için animasyonlar, Compose Animation kullanılarak NavOptionsCompat aracılığıyla ayarlanır. Navigation Component, animasyon türü üzerinde kısıtlama uygulamaz — translate, scale, alpha ve bunların kombinasyonları desteklenir.

Safe Args: tür güvenli argümanlar

Safe Args, ekranlar arasında tür güvenli veri aktarımı için bir Gradle eklentisidir. Eklenti, NavGraph'ı analiz eder, belirli alan türleriyle Directions ve Args sınıfları oluşturur. Tür eşleştirme derleme zamanında kontrol edilir — MissingArgumentException uygulama çalıştırılmadan önce yakalanır.

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

// Safe Args şunları oluşturur: DetailFragmentArgs, HomeFragmentDirections
// HomeFragment'te kullanım:
val action = HomeFragmentDirections
    .actionHomeToDetail(itemId = 42L)
findNavController().navigate(action)

// DetailFragment'te kullanım:
private val args: DetailFragmentArgs by navArgs()
// args.itemId Long türündedir, null iletilemez

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

navArgs(), bir Fragment veya Activity'de argümanları almak için bir Kotlin temsilcisidir. Eklenti, ilkel türleri, dizeleri, Parcelable, Serializable, Enum ve dizileri destekler. Karmaşık nesneler için bir kimlik iletin ve ViewModel veya veritabanından yükleyin.

Deep Link, uygulamanın belirli bir ekranını açan harici bir bağlantıdır. Navigation Component, NavGraph'taki app:deepLink özelliği aracılığıyla derin bağlantıları işler. Sistem, navigasyon yığınını hedef ekrana geri yükleyen bir PendingIntent oluşturur veya uygulama çalışmıyorsa yeni bir yığın oluşturur.

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

Derin Bağlantılar, yol ve sorgu parametreleri olan URI desenlerini, intent action ve mime türünü destekler. Yer tutucular ({userId}) otomatik olarak hedef argümanlarıyla eşleşir. Navigation Component ayrıca AndroidManifest aracılığıyla örtük derin bağlantıları da işler — NavHostFragment içeren Activity'ye intent-filter eklemeniz yeterlidir.

Navigation Compose (androidx.navigation:navigation-compose), Jetpack Compose için Navigation Component uzantısıdır. API, NavController ve NavHost kavramını korur, ancak ekranlar Fragment yerine Composable işlevleridir. NavHost, her rota için bir composable lambda kabul eder.

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, kimlikler yerine dize rotaları kullanır. Parametreler, rota şablonları ("detail/{itemId}") aracılığıyla iletilir ve backStackEntry'den çıkarılır. rememberNavController(), yeniden oluşturmalar arasında NavController'ı korur. Compose'ta tür güvenliği için navigation-compose-type-safety modülü (deneysel) önerilir.

Sıkça Sorulan Sorular

Navigation Component'te NavHost nedir?

NavHost, navigasyon ekranlarını görüntülemek için bir kapsayıcıdır. XML düzeninde NavHostFragment aracılığıyla uygulanır. NavHost, NavGraph'taki geçerli ekranı izler ve geçişleri yönetir. Her Activity bir NavHostFragment içerir.

Safe Args, Bundle'dan nasıl daha iyidir?

Safe Args, tür güvenli argüman sınıfları oluşturan bir Gradle eklentisidir. Bundle, anahtarların ve türlerin manuel olarak belirtilmesini gerektirir ve bu da çalışma zamanı hatalarına yol açar. Safe Args, türleri derleme zamanında kontrol eder ve verileri otomatik olarak serileştirir.

Navigation Component aracılığıyla karmaşık nesneler nasıl iletilir?

Karmaşık nesneler ViewModel (ekranlar arasında paylaşılan) aracılığıyla veya bir kimlik ileterek veritabanı aracılığıyla iletilir. Safe Args yalnızca ilkel türleri, dizeleri ve Parcelable'ı destekler. Google, navigasyon argümanları aracılığıyla büyük nesnelerin iletilmesinden kaçınılmasını önerir.

Navigation Component'te Deep Link nasıl çalışır?

Deep Link, NavGraph'ta app:deepLink özelliği aracılığıyla yapılandırılır. Navigation Component, gelen bağlantıları otomatik olarak işler, NavDeepLinkBuilder aracılığıyla bir PendingIntent oluşturur ve navigasyon yığınını hedef ekrana geri yükler. URI, intent action ve mime türünü destekler.

Navigation Component Jetpack Compose ile kullanılabilir mi?

Evet. Navigation Compose (androidx.navigation:navigation-compose), Compose için NavHost sağlar. API, XML sürümüne benzer, ancak ekranlar Composable işlevleridir. NavController her iki sürümde de aynı şekilde kullanılır. Google, yeni Compose projeleri için Navigation Compose'u önerir.

Özet

  • Navigation Component — NavController, NavHost ve NavGraph ile merkezi navigasyon için Android Jetpack kitaplığı
  • NavGraph — tüm ekranları (hedefler) ve aralarındaki bağlantıları (eylemler) tanımlayan XML grafiği
  • NavHostFragment — Activity düzeninde Geri düğmesi için defaultNavHost özelliğini destekleyen kapsayıcı
  • Safe Args — derleme zamanı tür denetimi ile tür güvenli argüman aktarımı için Gradle eklentisi
  • Derin Bağlantılar — otomatik navigasyon yığını geri yükleme ile URI, intent action ve mime türünü destekler
  • Navigation Compose — dize rotaları ve composable ekranlarla Jetpack Compose uzantısı
  • Navigation Component, yeni Android projelerinde Google tarafından önerilen tek navigasyon yöntemidir

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun