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 gezinmeyle gezinmeyi yöneten statik yöntemler içerir.

Üst uygulama çubuğu

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

bir üst uygulama çubuğunun gösterildiği ekran
Şekil 1. Üst tarafta uygulama çubuğunun gösterildiği 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, en üstteki 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 uygulamasını aşağıda açıklanan en iyi uygulama çubuğu uygulamalarıyla kullandığınızda, 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 en iyi uygulama çubuğu türlerini destekler:

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

AppBarYapılandırması

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 olmamasına bağlı olarak değişir.

Üst düzey hedef, hiyerarşik olarak birbiriyle ilişkili bir grup hedefte bulunan kök veya en üst düzey hedeftir. Üst düzey hedeflerde, daha üst düzey hedef olmadığından üst 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, hedef bir DrawerLayout kullanıyorsa Gezinme düğmesi çekmece simgesine dönüşür. Hedefte DrawerLayout kullanılmıyorsa Gezinme düğmesi gizlenir. Kullanıcı başka bir hedefin üzerindeyken, Gezinme düğmesi Yukarı düğmesi olarak görünür. Navigasyon 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ğıda gösterildiği gibi ilgili gezinme grafiğini atlayın:

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. Bunun için BottomNavigationView kullanmak yaygın bir kullanım alanıdır. Bu kullanım kapsamında, hiyerarşik olarak birbiriyle ilişkili olmayan ve her birinin kendi ilgili hedef grupları olabilir. Bunun gibi durumlarda, aşağıda gösterildiği gibi oluşturucuya bir dizi hedef kimliği aktarabilirsiniz:

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 çubuğu aşağıda gösterildiği gibi ana etkinliğinizde 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() ç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 için, AppBarConfiguration oluştururken üst düzey hedefleriniz için boş bir hedef kimliği grubu iletin. Örneğin, tüm hedeflerdeki Toolbar bölümünde bir Yukarı düğmesi görüntülenmesi gereken ikinci bir etkinliğiniz varsa bu yararlı olabilir. Bu, kullanıcının arka yığında başka hedef olmadığında üst etkinliğe geri gitmesine olanak tanır. Aşağıdaki örnekte gösterildiği gibi, navigateUp() tarafından normalde hiçbir şey yapmayacağı zamanlara ait yedek davranışını 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);
}

Daraltma Araç Çubuğu Düzeni Dahil Et

Araç Çubuğunuza bir CollapsingToolbarLayout eklemek için öncelikle Araç çubuğunu ve etkinliğinize uygun 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, aşağıda gösterildiği gibi ana etkinliğinizin onCreate yönteminden setupWithNavController() adlı kullanıcıyı ç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ğıda gösterildiği gibi setupActionBarWithNavController() çağrısı yapın. AppBarConfiguration öğenizi, onSupportNavigateUp() öğesini geçersiz kılarken de kullandığınızdan onCreate() dışında beyan etmeniz 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() öğesini 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, uygulamanızdaki her hedef için uygulama çubuğunun düzeni benzer olduğunda iyi sonuç verir. Ancak, üst uygulama çubuğunuz hedefler arasında önemli ölçüde değişiyorsa üst uygulama çubuğunu etkinliğinizden kaldırmayı ve her bir hedef parçada tanımlamayı düşünün.

Örneğin, hedeflerinizden birinde standart bir Toolbar, diğeri ise Şekil 2'de gösterildiği gibi sekmeler içeren daha karmaşık bir uygulama çubuğu oluşturmak için AppBarLayout kullanabilir.

üst tarafta iki uygulama çubuğu varyasyonu; solda standart bir araç çubuğu ve sağda araç çubuğu ile sekmelerin bulunduğu bir uygulama çubuğu
Şekil 2. İki uygulama çubuğu varyasyonu. Sol tarafta standart bir Toolbar. Sağ tarafta, Toolbar ve sekmeler içeren bir AppBarLayout var.

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

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

Ardından, sekmeler içeren bir uygulama çubuğu kullanan hedef parçayı 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ırma mantığı, bu parçaların her ikisi için de aynıdır. Ancak parçaları etkinlikten başlatmak yerine her parçanın onViewCreated() yöntemiyle setupWithNavController() ç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ğlayın

NavigationUI, hedefleri menü odaklı kullanıcı arayüzü bileşenlerine bağlamada da yardımcılar sağlar. NavigationUI yardımcı bir yöntem (onNavDestinationSelected()) içerir. Bu yöntem, ilişkili hedefi barındıran NavController ile birlikte bir MenuItem yöntemini alır. MenuItem öğesinin id öğesi hedefin id değeri ile eşleşirse NavController bu hedefe gidebilir.

Örneğin, aşağıdaki XML snippet'leri bir menü öğesini ve ortak id (details_page_fragment) ile bir 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>

Örneğin, menünüz Etkinlik'in onCreateOptionsMenu() özelliği aracılığıyla eklendiyse aşağıdaki örnekte gösterildiği gibi, onNavDestinationSelected() yöntemini çağırmak için Etkinlik'in onOptionsItemSelected() değerini 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 otomatik olarak aynı id ile ilgili hedefe gidiyor.

Gezinme çekmecesi ekleme

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

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

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

Gezinme çekmecesi eklemek için önce kök görünüm olarak bir DrawerLayout bildiriminde bulunun. DrawerLayout içinde, 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ılır: ana içerik için NavHostFragment, gezinme çekmecesinin içeriği için ise 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 geçirerek 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, aşağıda gösterildiği gibi ana etkinliğinizin onCreate() yönteminden setupWithNavController() çağrısı yapı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);
}

Gezinme 2.4.0-alpha01 sürümünden başlayarak, setupWithNavController kullandığınızda her bir menü öğesinin durumu kaydedilir ve geri yüklenir.

Alt gezinme

NavigationUI alt gezinme menüsünü de kullanabilir. Kullanıcı bir menü öğesi seçtiğinde, NavController onNavDestinationSelected() adlı aracı arar ve alt gezinme çubuğunda seçili öğeyi otomatik olarak günceller.

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

Uygulamanızda bir alt gezinme çubuğu oluşturmak için önce ana etkinliğinizde çubuğu aşağıda gösterildiği 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, aşağıda gösterildiği gibi ana etkinliğinizin onCreate() yönteminden setupWithNavController() çağrısı yapı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);
}

Gezinme 2.4.0-alpha01 sürümünden başlayarak, setupWithNavController kullandığınızda her bir menü öğesinin durumu kaydedilir ve geri yüklenir.

Alt gezinme menüsünü içeren kapsamlı bir örnek için GitHub'daki Android Mimari Bileşenleri Gelişmiş Gezinme Örneği'ne bakın.

Gezinme etkinliklerini dinleyin

Hedefler arasında gezinmenin birincil yöntemi NavController ile etkileşim kurmaktır. NavController, NavHost içeriğinin yeni hedefle değiştirilmesinden sorumludur. Çoğu durumda, üst uygulama çubuğu veya BottomNavigationBar gibi diğer kalıcı gezinme kontrolleri gibi kullanıcı arayüzü öğeleri NavHost dışında yer alır ve hedefler arasında gezinirken güncellenmesi gerekir.

NavController, NavController öğesinin geçerli hedefi veya bağımsız değişkenleri değiştiğinde çağrılan bir OnDestinationChangedListener arayüzü sunar. addOnDestinationChangedListener() yöntemi aracılığıyla yeni bir işleyici kaydedilebilir. addOnDestinationChangedListener() çağrılırken geçerli hedef varsa bunun hemen işleyicinize gönderildiğini unutmayın.

NavigationUI, bu yaygın kullanıcı arayüzü bileşenlerinin gezinmeye duyarlı olmasını sağlamak için OnDestinationChangedListener kullanır. Bununla birlikte, özel kullanıcı arayüzlerinin veya işletme mantığının gezinme etkinliklerini fark etmesini sağlamak için OnDestinationChangedListener özelliğini tek başına da kullanabileceğinizi unutmayın.

Örneğin, uygulamanızın bazı alanlarında gösterirken diğerlerinde 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ı işleyiciler

Alternatif olarak, gezinme grafiğinde varsayılan değerlere sahip bağımsız değişkenler de kullanabilirsiniz. Bu varsayılan değerler, uygun kullanıcı arayüzü denetleyicisi tarafından durumunu güncellemek için kullanılabilir. Örneğin, OnDestinationChangedListener içindeki mantığı önceki örnekte olduğu gibi hedef kimliğine 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 kullanılmaz. Bunun yerine, defaultValue kullanarak hedefe ek bilgiler eklemenin bir yolu olarak kullanılır. Bu durumda değer, bu hedefte uygulama çubuğunun gösterilip gösterilmeyeceğini belirtir.

Artık Activity öğesine 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);
                }
            }
        }
);

Gezinme hedefi her değiştiğinde NavController bu geri çağırmayı çağırır. Activity artık geri çağırmada 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 kullanıcısının gezinme grafiğinde yalnızca bağımsız değişkenleri görmesi ve bireysel Fragment rollerini ve sorumluluklarını bilmemesidir. Benzer şekilde, bağımsız parçalar kapsayıcı Activity öğesini ve sahip olduğu kullanıcı arayüzü bileşenlerini bilmez.

Ek kaynaklar

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

Sana Özel

Codelab uygulamaları

Blog yayınları

Videolar