NavigationUI kullanarak kullanıcı arayüzü bileşenlerini NavController'a bağlama

Gezinme bileşeni bir NavigationUI sınıfı içerir. Bu sınıf, üst uygulama çubuğu, gezinme çekmecesi ve alt gezinme menüsünü kullanarak gezinmeyi yöneten statik yöntemler içerir.

Üst uygulama çubuğu

Üst uygulama çubuğu, geçerli ekrandaki bilgileri ve işlemleri göstermek için uygulamanızın üst kısmında tutarlı bir yer sağlar.

Üst uygulama çubuğunu gösteren ekran
Şekil 1. En popüler uygulamalar çubuğunu gösteren bir ekran.

NavigationUI, kullanıcılar uygulamanızda gezinirken üst uygulama çubuğunuzdaki içeriği otomatik olarak güncelleyen yöntemler içerir. Örneğin, NavigationUI üst uygulama çubuğunun başlığını güncel tutmak için gezinme grafiğinizdeki hedef etiketlerini kullanır.

<navigation>
    <fragment ...
              android:label="Page title">
      ...
    </fragment>
</navigation>

NavigationUI, aşağıda açıklanan üst uygulama çubuğu uygulamalarında kullanıldığında, hedeflere eklediğiniz etiket, etiketinizde {argName} biçimi kullanılarak hedefe sağlanan bağımsız değişkenlerden otomatik olarak doldurulabilir.

NavigationUI, aşağıdaki üst uygulama çubuğu türlerini destekler:

Uygulama çubukları hakkında daha fazla bilgi için Uygulama çubuğunu ayarlama başlıklı makaleyi inceleyin.

AppBarConfiguration

NavigationUI, uygulamanızın görüntüleme alanının sol üst köşesindeki Gezinme düğmesinin davranışını yönetmek için bir AppBarConfiguration nesnesi kullanır. Gezinme düğmesinin davranışı, kullanıcının üst düzey bir hedefte olup olmadığına bağlı olarak değişir.

Üst düzey hedef, hiyerarşik olarak ilişkili bir hedef grubundaki kök veya en üst düzey hedeftir. Üst düzey hedeflerde, daha üst düzey bir hedef olmadığı için en üstteki uygulama çubuğunda Yukarı düğmesi gösterilmez. Varsayılan olarak, uygulamanızın başlangıç hedefi tek üst düzey hedeftir.

Kullanıcı üst düzey bir hedefteyken, hedefte DrawerLayout kullanılıyorsa Gezinme düğmesi bir çekmece simgesi haline gelir. Hedefte DrawerLayout kullanılmıyorsa Gezinme düğmesi gizlenir. Kullanıcı başka bir hedefteyken Gezinme düğmesi yukarı düğmesi olarak görünür. Gezinme düğmesini, üst düzey hedef olarak yalnızca başlangıç hedefini kullanarak yapılandırmak için bir AppBarConfiguration nesnesi oluşturun ve aşağıdaki gibi ilgili gezinme grafiğini iletin:

Kotlin

val appBarConfiguration = AppBarConfiguration(navController.graph)

Java

AppBarConfiguration appBarConfiguration =
        new AppBarConfiguration.Builder(navController.getGraph()).build();

Bazı durumlarda, varsayılan başlangıç hedefini kullanmak yerine birden fazla üst düzey hedef tanımlamanız gerekebilir. BottomNavigationView kullanmak, bu tür durumlarda yaygın bir kullanım alanıdır. Hiyerarşik olarak birbirine bağlı olmayan ve her birinin kendi ilgili hedefleri olan kardeş ekranlarınız olabilir. Bu gibi durumlarda, aşağıdaki gibi bir hedef kimlikleri grubunu oluşturucuya iletebilirsiniz:

Kotlin

val appBarConfiguration = AppBarConfiguration(setOf(R.id.main, R.id.profile))

Java

AppBarConfiguration appBarConfiguration =
        new AppBarConfiguration.Builder(R.id.main, R.id.profile).build();

Araç çubuğu oluşturma

NavigationUI ile bir araç çubuğu oluşturmak için önce ana etkinliğinizde çubuğu aşağıdaki gibi tanımlayın:

<LinearLayout>
    <androidx.appcompat.widget.Toolbar
        android:id="@+id/toolbar" />
    <androidx.fragment.app.FragmentContainerView
        android:id="@+id/nav_host_fragment"
        ... />
    ...
</LinearLayout>

Ardından, aşağıdaki örnekte gösterildiği gibi ana etkinliğinizin onCreate() yönteminden setupWithNavController() işlevini çağırın:

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    setContentView(R.layout.activity_main)

    ...

    val navController = findNavController(R.id.nav_host_fragment)
    val appBarConfiguration = AppBarConfiguration(navController.graph)
    findViewById<Toolbar>(R.id.toolbar)
        .setupWithNavController(navController, appBarConfiguration)
}

Java

@Override
protected void onCreate(Bundle savedInstanceState) {
    setContentView(R.layout.activity_main);

    ...

    NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
    AppBarConfiguration appBarConfiguration =
            new AppBarConfiguration.Builder(navController.getGraph()).build();
    Toolbar toolbar = findViewById(R.id.toolbar);
    NavigationUI.setupWithNavController(
            toolbar, navController, appBarConfiguration);
}

Gezinme düğmesini tüm hedefler için Yukarı düğmesi olarak görünecek şekilde yapılandırmak istiyorsanız AppBarConfiguration öğenizi oluştururken üst düzey hedefleriniz için boş bir hedef kimlikleri grubu iletin. Örneğin, tüm hedeflerde Toolbar içinde bir Yukarı düğmesi göstermesi gereken ikinci bir etkinliğiniz varsa bu özellik yararlı olabilir. Bu sayede kullanıcı, arka yığınta başka hedef olmadığında üst etkinliğe geri dönebilir. Aşağıdaki örnekte gösterildiği gibi, navigateUp()'ın hiçbir şey yapmadığı durumlarda yedek davranışı kontrol etmek için setFallbackOnNavigateUpListener() kullanabilirsiniz:

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    ...

    val navHostFragment =
        supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
    val navController = navHostFragment.navController
    val appBarConfiguration = AppBarConfiguration(
        topLevelDestinationIds = setOf(),
        fallbackOnNavigateUpListener = ::onSupportNavigateUp
    )
    findViewById<Toolbar>(R.id.toolbar)
        .setupWithNavController(navController, appBarConfiguration)
}

Java

@Override
protected void onCreate(Bundle savedInstanceState) {
    ...

    NavHostFragment navHostFragment = (NavHostFragment) supportFragmentManager.findFragmentById(R.id.nav_host_fragment);
    NavController navController = navHostFragment.getNavController();
    AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder()
        .setFallbackOnNavigateUpListener(::onSupportNavigateUp)
        .build();
    Toolbar toolbar = findViewById(R.id.toolbar);
    NavigationUI.setupWithNavController(
            toolbar, navController, appBarConfiguration);
}

CollapsingToolbarLayout'ı dahil edin

Araç çubuğunuza CollapsingToolbarLayout eklemek için öncelikle etkinliğinizde araç çubuğunu ve çevredeki düzeni aşağıda gösterildiği gibi tanımlayın:

<LinearLayout>
    <com.google.android.material.appbar.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="@dimen/tall_toolbar_height">

        <com.google.android.material.appbar.CollapsingToolbarLayout
            android:id="@+id/collapsing_toolbar_layout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:contentScrim="?attr/colorPrimary"
            app:expandedTitleGravity="top"
            app:layout_scrollFlags="scroll|exitUntilCollapsed|snap">

            <androidx.appcompat.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                app:layout_collapseMode="pin"/>
        </com.google.android.material.appbar.CollapsingToolbarLayout>
    </com.google.android.material.appbar.AppBarLayout>

    <androidx.fragment.app.FragmentContainerView
        android:id="@+id/nav_host_fragment"
        ... />
    ...
</LinearLayout>

Ardından, ana etkinliğinizin onCreate yönteminden setupWithNavController() işlevini çağırın.

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    setContentView(R.layout.activity_main)

    ...

    val layout = findViewById<CollapsingToolbarLayout>(R.id.collapsing_toolbar_layout)
    val toolbar = findViewById<Toolbar>(R.id.toolbar)
    val navHostFragment =
        supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
    val navController = navHostFragment.navController
    val appBarConfiguration = AppBarConfiguration(navController.graph)
    layout.setupWithNavController(toolbar, navController, appBarConfiguration)
}

Java

@Override
protected void onCreate(Bundle savedInstanceState) {
    setContentView(R.layout.activity_main);

    ...

    CollapsingToolbarLayout layout = findViewById(R.id.collapsing_toolbar_layout);
    Toolbar toolbar = findViewById(R.id.toolbar);
    NavHostFragment navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment);
    NavController navController = navHostFragment.getNavController();
    AppBarConfiguration appBarConfiguration =
            new AppBarConfiguration.Builder(navController.getGraph()).build();
    NavigationUI.setupWithNavController(layout, toolbar, navController, appBarConfiguration);
}

İşlem çubuğu

Varsayılan işlem çubuğuna gezinme desteği eklemek için ana etkinliğinizin onCreate() yönteminden aşağıdaki gibi setupActionBarWithNavController() çağırın. onSupportNavigateUp() değerini geçersiz kılarken de kullanacağınız için AppBarConfiguration değerinizi onCreate() dışında tanımlamanız gerektiğini unutmayın:

Kotlin

private lateinit var appBarConfiguration: AppBarConfiguration

...

override fun onCreate(savedInstanceState: Bundle?) {
    ...

    val navHostFragment =
        supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
    val navController = navHostFragment.navController
    appBarConfiguration = AppBarConfiguration(navController.graph)
    setupActionBarWithNavController(navController, appBarConfiguration)
}

Java

AppBarConfiguration appBarConfiguration;

...

@Override
protected void onCreate(Bundle savedInstanceState) {
    ...

    NavHostFragment navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment);
    NavController navController = navHostFragment.getNavController();
    appBarConfiguration = new AppBarConfiguration.Builder(navController.getGraph()).build();
    NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);
}

Ardından, yukarı gezinmeyi işlemek için onSupportNavigateUp()'ü geçersiz kılın:

Kotlin

override fun onSupportNavigateUp(): Boolean {
    val navController = findNavController(R.id.nav_host_fragment)
    return navController.navigateUp(appBarConfiguration)
            || super.onSupportNavigateUp()
}

Java

@Override
public boolean onSupportNavigateUp() {
    NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
    return NavigationUI.navigateUp(navController, appBarConfiguration)
            || super.onSupportNavigateUp();
}

Uygulama çubuğu varyasyonlarını destekleme

Üst uygulama çubuğunu etkinliğinize eklemek, uygulama çubuğu düzeni uygulamanızdaki her hedef için benzer olduğunda işe yarar. Ancak üst uygulama çubuğunuz hedefler arasında önemli ölçüde değişiyorsa üst uygulama çubuğunu etkinliğinizden kaldırıp bunun yerine her hedef parçasında tanımlamayı düşünebilirsiniz.

Örneğin, hedeflerinizin biri standart bir Toolbar kullanırken diğeri, sekme içeren daha karmaşık bir uygulama çubuğu oluşturmak için AppBarLayout kullanır (Şekil 2'de gösterilmiştir).

iki üst uygulama çubuğu varyasyonu: solda standart bir araç çubuğu ve sağda bir araç çubuğu ve sekmeler içeren bir appbarlayout
Şekil 2. İki uygulama çubuğu varyasyonu. Sol tarafta standart bir Toolbar. Sağ tarafta, Toolbar ve sekmeler bulunan bir AppBarLayout.

Bu örneği NavigationUI kullanarak hedef parçalarınızda uygulamak için önce standart bir araç çubuğu kullanan hedef parçadan başlayarak her bir parça düzeninizde uygulama çubuğunu tanımlayın:

<LinearLayout>
    <androidx.appcompat.widget.Toolbar
        android:id="@+id/toolbar"
        ... />
    ...
</LinearLayout>

Ardından, sekmeli bir uygulama çubuğu kullanan hedef fragmanı tanımlayın:

<LinearLayout>
    <com.google.android.material.appbar.AppBarLayout
        ... />

        <androidx.appcompat.widget.Toolbar
            android:id="@+id/toolbar"
            ... />

        <com.google.android.material.tabs.TabLayout
            ... />

    </com.google.android.material.appbar.AppBarLayout>
    ...
</LinearLayout>

Gezinme yapılandırması mantığı bu iki parça için aynıdır. Bununla birlikte, her bir parçayı etkinlikten başlatmak yerine setupWithNavController()'i her bir parçanın onViewCreated() yönteminden çağırmanız gerekir:

Kotlin

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    val navController = findNavController()
    val appBarConfiguration = AppBarConfiguration(navController.graph)

    view.findViewById<Toolbar>(R.id.toolbar)
            .setupWithNavController(navController, appBarConfiguration)
}

Java

@Override
public void onViewCreated(@NonNull View view,
                          @Nullable Bundle savedInstanceState) {
    NavController navController = Navigation.findNavController(view);
    AppBarConfiguration appBarConfiguration =
            new AppBarConfiguration.Builder(navController.getGraph()).build();
    Toolbar toolbar = view.findViewById(R.id.toolbar);

    NavigationUI.setupWithNavController(
            toolbar, navController, appBarConfiguration);
}

Hedefleri menü öğelerine bağlama

NavigationUI, hedefleri menü tabanlı kullanıcı arayüzü bileşenlerine bağlamak için yardımcı araçlar da sağlar. NavigationUI, ilişkili hedefi barındıran NavController ile birlikte bir MenuItem alan onNavDestinationSelected() yardımcı yöntemi içerir. MenuItem öğesinin id değeri hedefin id değeriyle eşleşirse NavController bu hedefe gidebilir.

Örneğin, aşağıdaki XML snippet'leri ortak bir id, details_page_fragment içeren bir menü öğesini ve hedefi tanımlar:

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:android="http://schemas.android.com/apk/res/android"
    ... >

    ...

    <fragment android:id="@+id/details_page_fragment"
         android:label="@string/details"
         android:name="com.example.android.myapp.DetailsFragment" />
</navigation>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

    ...

    <item
        android:id="@+id/details_page_fragment"
        android:icon="@drawable/ic_details"
        android:title="@string/details" />
</menu>

Menünüz, etkinlikteki onCreateOptionsMenu() aracılığıyla eklendiyse aşağıdaki örnekte gösterildiği gibi, onNavDestinationSelected()'yi çağırmak için etkinlikteki onOptionsItemSelected()'yi geçersiz kılarak menü öğelerini hedeflerle ilişkilendirebilirsiniz:

Kotlin

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    val navController = findNavController(R.id.nav_host_fragment)
    return item.onNavDestinationSelected(navController) || super.onOptionsItemSelected(item)
}

Java

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
    return NavigationUI.onNavDestinationSelected(item, navController)
            || super.onOptionsItemSelected(item);
}

Artık kullanıcı details_page_fragment menü öğesini tıkladığında uygulama, aynı id ile otomatik olarak ilgili hedefe gider.

Gezinme çekmecesi ekleme

Gezinme çekmecesi, uygulamanızın ana gezinme menüsünü gösteren bir kullanıcı arayüzü panelidir. Çekmece, kullanıcı uygulama çubuğundaki çekmece simgesine dokunduğunda veya ekranın sol kenarından parmağını kaydırdığında görünür.

Gezinme menüsünü gösteren açık bir çekmece
Şekil 3. Gezinme menüsünü gösteren açık bir çekmece.

Çekmece simgesi, DrawerLayout kullanan tüm üst düzey hedeflerde gösterilir.

Gezinme çekmecesi eklemek için önce kök görünüm olarak bir DrawerLayout tanımlayın. DrawerLayout içine ana kullanıcı arayüzü içeriği için bir düzen ve gezinme çekmecesinin içeriğini içeren başka bir görünüm ekleyin.

Örneğin, aşağıdaki düzende iki alt görünüme sahip bir DrawerLayout kullanılmaktadır: Ana içeriği barındıran bir NavHostFragment ve gezinme çekmecesinin içeriği için bir NavigationView.

<?xml version="1.0" encoding="utf-8"?>
<!-- Use DrawerLayout as root container for activity -->
<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true">

    <!-- Layout to contain contents of main body of screen (drawer will slide over this) -->
    <androidx.fragment.app.FragmentContainerView
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:id="@+id/nav_host_fragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:defaultNavHost="true"
        app:navGraph="@navigation/nav_graph" />

    <!-- Container for contents of drawer - use NavigationView to make configuration easier -->
    <com.google.android.material.navigation.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:fitsSystemWindows="true" />

</androidx.drawerlayout.widget.DrawerLayout>

Ardından, aşağıdaki örnekte gösterildiği gibi DrawerLayout öğesini AppBarConfiguration öğesine ileterek gezinme grafiğinize bağlayın:

Kotlin

val appBarConfiguration = AppBarConfiguration(navController.graph, drawerLayout)

Java

AppBarConfiguration appBarConfiguration =
        new AppBarConfiguration.Builder(navController.getGraph())
            .setDrawerLayout(drawerLayout)
            .build();

Ardından, ana etkinlik sınıfınızda, ana etkinliğinizin onCreate() yönteminden setupWithNavController() işlevini aşağıdaki gibi çağırın:

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    setContentView(R.layout.activity_main)

    ...

    val navHostFragment =
        supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
    val navController = navHostFragment.navController
    findViewById<NavigationView>(R.id.nav_view)
        .setupWithNavController(navController)
}

Java

@Override
protected void onCreate(Bundle savedInstanceState) {
    setContentView(R.layout.activity_main);

    ...

    NavHostFragment navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment);
    NavController navController = navHostFragment.getNavController();
    NavigationView navView = findViewById(R.id.nav_view);
    NavigationUI.setupWithNavController(navView, navController);
}

Navigation 2.4.0-alpha01 sürümünden itibaren her menü öğesinin durumu kaydedilir ve setupWithNavController kullanıldığında geri yüklenir.

Alt gezinme

NavigationUI, alt gezinmeyi de işleyebilir. Kullanıcı bir menü öğesini seçtiğinde NavController, onNavDestinationSelected() işlevini çağırır ve alt gezinme çubuğundaki seçili öğeyi otomatik olarak günceller.

alt gezinme çubuğu
Şekil 4. Alt gezinme çubuğu.

Uygulamanızda alt gezinme çubuğu oluşturmak için önce çubuğu ana etkinliğinizde aşağıdaki gibi tanımlayın:

<LinearLayout>
    ...
    <androidx.fragment.app.FragmentContainerView
        android:id="@+id/nav_host_fragment"
        ... />
    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/bottom_nav"
        app:menu="@menu/menu_bottom_nav" />
</LinearLayout>

Ardından, ana etkinlik sınıfınızda, ana etkinliğinizin onCreate() yönteminden setupWithNavController() işlevini aşağıdaki gibi çağırın:

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    setContentView(R.layout.activity_main)

    ...

    val navHostFragment =
        supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
    val navController = navHostFragment.navController
    findViewById<BottomNavigationView>(R.id.bottom_nav)
        .setupWithNavController(navController)
}

Java

@Override
protected void onCreate(Bundle savedInstanceState) {
    setContentView(R.layout.activity_main);

    ...

    NavHostFragment navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment);
    NavController navController = navHostFragment.getNavController();
    BottomNavigationView bottomNav = findViewById(R.id.bottom_nav);
    NavigationUI.setupWithNavController(bottomNav, navController);
}

Navigation 2.4.0-alpha01 sürümünden itibaren her menü öğesinin durumu kaydedilir ve setupWithNavController kullanıldığında geri yüklenir.

Gezinme etkinliklerini dinleme

Hedefler arasında gezinmek için birincil yöntem NavController ile etkileşim kurmaktır. NavController, NavHost içeriğini yeni hedefle değiştirmekten sorumludur. Çoğu durumda, üst uygulama çubuğu veya BottomNavigationBar gibi kalıcı gezinme kontrolleri gibi kullanıcı arayüzü öğeleri NavHost dışında bulunur ve hedefler arasında gezinirken güncellenmesi gerekir.

NavController, NavController'ın mevcut hedefi veya bağımsız değişkenleri değiştiğinde çağrılan bir OnDestinationChangedListener arayüzü sunar. Yeni bir dinleyici, addOnDestinationChangedListener() yöntemi aracılığıyla kaydedilebilir. addOnDestinationChangedListener() çağrısı yapıldığında, mevcut hedef varsa dinleyicinize hemen gönderilir.

NavigationUI, bu yaygın kullanıcı arayüzü bileşenlerini gezinmeyle uyumlu hale getirmek için OnDestinationChangedListener'ı kullanır. Ancak özel kullanıcı arayüzlerini veya iş mantıklarını gezinme etkinliklerinden haberdar etmek için OnDestinationChangedListener'ü tek başına da kullanabileceğinizi unutmayın.

Örneğin, uygulamanızın bazı bölümlerinde göstermek, diğer bölümlerinde ise gizlemek istediğiniz ortak kullanıcı arayüzü öğeleriniz olabilir. Kendi OnDestinationChangedListener öğenizi kullanarak, aşağıdaki örnekte gösterildiği gibi bu kullanıcı arayüzü öğelerini hedef hedefe göre seçerek gösterebilir veya gizleyebilirsiniz:

Kotlin

navController.addOnDestinationChangedListener { _, destination, _ ->
   if(destination.id == R.id.full_screen_destination) {
       toolbar.visibility = View.GONE
       bottomNavigationView.visibility = View.GONE
   } else {
       toolbar.visibility = View.VISIBLE
       bottomNavigationView.visibility = View.VISIBLE
   }
}

Java

navController.addOnDestinationChangedListener(new NavController.OnDestinationChangedListener() {
   @Override
   public void onDestinationChanged(@NonNull NavController controller,
           @NonNull NavDestination destination, @Nullable Bundle arguments) {
       if(destination.getId() == R.id.full_screen_destination) {
           toolbar.setVisibility(View.GONE);
           bottomNavigationView.setVisibility(View.GONE);
       } else {
           toolbar.setVisibility(View.VISIBLE);
           bottomNavigationView.setVisibility(View.VISIBLE);
       }
   }
});

Bağımsız değişkene dayalı dinleyiciler

Alternatif olarak, gezinme grafiğinde varsayılan değerlere sahip bağımsız değişkenler de kullanabilirsiniz. Bu bağımsız değişkenler, durumunu güncellemek için uygun kullanıcı arayüzü denetleyicisi tarafından kullanılabilir. Örneğin, önceki örnekte olduğu gibi OnDestinationChangedListener içindeki mantığı hedef kimliğe dayandırmak yerine NavGraph içinde bir bağımsız değişken oluşturabiliriz:

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/navigation\_graph"
    app:startDestination="@id/fragmentOne">
    <fragment
        android:id="@+id/fragmentOne"
        android:name="com.example.android.navigation.FragmentOne"
        android:label="FragmentOne">
        <action
            android:id="@+id/action\_fragmentOne\_to\_fragmentTwo"
            app:destination="@id/fragmentTwo" />
    </fragment>
    <fragment
        android:id="@+id/fragmentTwo"
        android:name="com.example.android.navigation.FragmentTwo"
        android:label="FragmentTwo">
        <argument
            android:name="ShowAppBar"
            android:defaultValue="true" />
    </fragment>
</navigation>

Bu bağımsız değişken, hedefe gidilirken değil, defaultValue kullanılarak hedefe ek bilgi eklemek için kullanılır. Bu durumda değer, uygulama çubuğunun bu hedefte gösterilip gösterilmeyeceğini belirtir.

Artık Activity alanına bir OnDestinationChangedListener ekleyebiliriz:

Kotlin

navController.addOnDestinationChangedListener { _, _, arguments ->
    appBar.isVisible = arguments?.getBoolean("ShowAppBar", false) == true
}

Java

navController.addOnDestinationChangedListener(
        new NavController.OnDestinationChangedListener() {
            @Override
            public void onDestinationChanged(
                    @NonNull NavController controller,
                    @NonNull NavDestination destination,
                    @Nullable Bundle arguments
            ) {
                boolean showAppBar = false;
                if (arguments != null) {
                    showAppBar = arguments.getBoolean("ShowAppBar", false);
                }
                if(showAppBar) {
                    appBar.setVisibility(View.VISIBLE);
                } else {
                    appBar.setVisibility(View.GONE);
                }
            }
        }
);

NavController, navigasyon hedefi değiştiğinde bu geri çağırma işlevini çağırır. Activity artık geri çağırma işlevinde alınan bağımsız değişkenlere göre sahip olduğu kullanıcı arayüzü bileşenlerinin durumunu veya görünürlüğünü güncelleyebilir.

Bu yaklaşımın bir avantajı, Activity'nin yalnızca gezinme grafiğindeki bağımsız değişkenleri görmesi ve ayrı Fragment rollerini ve sorumluluklarını bilmemesidir. Benzer şekilde, bağımsız parçalar da kapsayıcı Activity ve sahip olduğu kullanıcı arayüzü bileşenleri hakkında bilgi sahibi değildir.

Ek kaynaklar

Gezinme hakkında daha fazla bilgi edinmek için aşağıdaki ek kaynaklara bakın.

Örnekler

Codelab uygulamaları

Blog yayınları

Videolar