Çok modüllü projeler için gezinmeyle ilgili en iyi uygulamalar

Bir gezinme grafiği, aşağıdakilerin herhangi bir kombinasyonundan oluşabilir:

  • <fragment> hedefi gibi tek bir hedef.
  • İç içe yerleştirilmiş bir grafik bir dizi alakalı hedefi kapsayan bir uygulamadır.
  • <include> öğesi, Bu, sanki başka bir gezinme grafiği dosyası gibi iç içe yerleştirilmiştir.

Bu esneklik, daha küçük gezinme grafiklerini birleştirmenize olanak tanır. uygulamanızın tam gezinme grafiğini oluşturun. Bu küçük gezinme seçenekleri, grafikleri ayrı modüller tarafından sağlanır.

Bu konudaki örneklerde her bir özellik modülü bir özelliğe tüm hedefleri kapsayan tek bir gezinme grafiği sağlar gerekiyor. Bir üretim uygulamasında daha düşük düzeydeki alt modüllerin, uygulama ayrıntılarını içeren özellik modülü. Bu özellik modüllerinin her biri, doğrudan veya dolaylı olarak app modülünü inceleyin. Örnek çok modüllü uygulamada şuna sahiptir: şu yapıda:

örnek çok modüllü uygulama için bağımlılık grafiği
örnek uygulamanın başlangıç hedefi
Şekil 1. Uygulama mimarisi ve başlangıç hedefi ekleyin.
'nı inceleyin.

Her özellik modülü, kendi gezinme grafiğine sahip bağımsız bir birimdir ve varış noktaları. app modülü her biri için bağlıdır ve aşağıdaki gösterildiği gibi, build.gradle dosyasında uygulamanın ayrıntılarını görebilirsiniz:

Eski

dependencies {
    ...
    implementation project(":feature:home")
    implementation project(":feature:favorites")
    implementation project(":feature:settings")

Kotlin

dependencies {
    ...
    implementation(project(":feature:home"))
    implementation(project(":feature:favorites"))
    implementation(project(":feature:settings"))

app modülünün rolü

app modülü, alışverişinizle ilgili tüm ayrıntıları uygulamanıza ve NavHost öğesini kullanıcı arayüzünüze ekleyin. app modülünün bir gezinme grafiğinde <include> Bu sırada <include> kullanımı, işlevsel olarak iç içe yerleştirilmiş bir grafikle aynıdır. <include>, diğer proje modüllerindeki veya kitaplıktaki grafikleri destekler şu örnekte gösterildiği gibi:

<?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"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/nav_graph"
    app:startDestination="@id/home_nav_graph">

    <include app:graph="@navigation/home_navigation" />
    <include app:graph="@navigation/favorites_navigation" />
    <include app:graph="@navigation/settings_navigation" />
</navigation>

Bir kitaplık üst düzey gezinme grafiğine eklendikten sonra, şunları yapabilirsiniz: gezinme değişiklik gösterebilir. Örneğin, Yeşil Ofis projenizde gezinme grafiğinizin bir parçasından ayarlar grafiğine gitmek, gösterildiği gibi:

<?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"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/nav_graph"
    app:startDestination="@id/home_nav_graph">

    <include app:graph="@navigation/home_navigation" />
    <include app:graph="@navigation/favorites_navigation" />
    <include app:graph="@navigation/settings_navigation" />

    <fragment
        android:id="@+id/random_fragment"
        android:name="com.example.android.RandomFragment"
        android:label="@string/fragment_random" >
        <!-- Launch into Settings Navigation Graph -->
        <action
            android:id="@+id/action_random_fragment_to_settings_nav_graph"
            app:destination="@id/settings_nav_graph" />
    </fragment>
</navigation>

Birden fazla özellik modülünün ortak bir kampanya kümesine referans vermesi gerektiğinde (ör. giriş grafiği gibi) bu hedefleri yerleştirmemeniz gerekir. her özellik modülünün gezinme grafiğine ortak hedefler ekleyin. Bunun yerine Bu yaygın hedefleri app modülünüzün gezinme grafiğine ekleyin. Böylece her özellik modülü, özellik modülleri arasında gezinebilir. bu ortak hedeflere gitmek için kullanabilirsiniz.

Yukarıdaki örnekte, işlem bir gezinme hedefi belirtir / @id/settings_nav_graph. Bu kimlik, dahil edilen grafikte @navigation/settings_navigation. tanımlandı

Uygulama modülünde üst düzey gezinme

Gezinme bileşeni bir NavigationUI sınıfı. Bu sınıf, üst tarafta gezinmeyi yöneten statik yöntemler içeriyor uygulama çubuğu, gezinme çekmecesi ve alt gezinme bölümü. Uygulamanız üst düzey hedefler, özellik tarafından sağlanan kullanıcı arayüzü öğelerinden oluşur modüllerin de yer aldığı app modülü, üst düzey gezinme ve kullanıcı arayüzü öğeleri gibi öğeler içerir. Uygulama modülü tüm hedeflerine erişilebildiğinden emin olun. koddan emin olun. Bu, sorunlarınızı NavigationUI - hedefleri menü öğelerine bağlama öğenin kimliği bir hedefin kimliğiyle eşleşirse.

Şekil 2'de, örnek app modülü bir BottomNavigationView üzerine konuşacağız. Menüdeki menü öğesi kimlikleri gezinmeyle eşleşiyor kitaplık grafiklerinin grafik kimlikleri:

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

    <item
        android:id="@id/home_nav_graph"
        android:icon="@drawable/ic_home"
        android:title="Home"
        app:showAsAction="ifRoom"/>

    <item
        android:id="@id/favorites_nav_graph"
        android:icon="@drawable/ic_favorite"
        android:title="Favorites"
        app:showAsAction="ifRoom"/>

    <item
        android:id="@id/settings_nav_graph"
        android:icon="@drawable/ic_settings"
        android:title="Settings"
        app:showAsAction="ifRoom" />
</menu>

NavigationUI uygulamasının alt gezinme menüsü, arama setupWithNavController() aşağıda gösterildiği gibi, ana etkinlik sınıfınızda onCreate() adlı sınıftan örnek:

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    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) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    NavHostFragment navHostFragment =
            (NavHostFragment) supportFragmentManager.findFragmentById(R.id.nav_host_fragment);
    NavController navController = navHostFragment.getNavController();
    BottomNavigationView bottomNav = findViewById(R.id.bottom_nav);

    NavigationUI.setupWithNavController(bottomNav, navController);
}

Bu kod yerleştirildikten sonra, NavigationUI uygun kullanıcı aşağıdaki gezinme öğelerinden birini tıkladığında kitaplık grafiği.

Unutmayın, uygulama modülünüzde bir veya daha fazla derinden gömülü belirli bir hedefe sıkı bağımlılık özellik modüllerinizin gezinme grafiğidir. Çoğu durumda, uygulamanızın modülünün yalnızca, yerleşik veya eklenmiş herhangi bir öğenin giriş gezinme grafikleri (bu, özellik modüllerinin dışında da geçerlidir). İhtiyacınız varsa kütüphanenizin gezinme grafiğinin derinliklerinde bulunan bir hedefe bağlantı vermek için bunun tercih edilen yolu bir derin bağlantı ekleyin. Derin bağlantı: kitaplığın başka bir yoldaki bir hedefe gitmesinin tek yoludur. gezinme grafiğini kullanabilirsiniz.

Özellik modülleri arasında gezinme

Bağımsız özellik modülleri, derleme sırasında birbirini göremez. Bu nedenle, diğer modüllerdeki hedeflere gitmek için kimlikleri kullanamazsınız. Bunun yerine Gezinmek için derin bağlantı kullanın alakalı bir hedefe dolaylı derin bağlantı.

Önceki örnekten devam ettiğimizde, aynı girişteki bir düğmeden :feature:home modülünü :feature:settings iç içe yerleştirilmiş bir hedefe modülünü kullanabilirsiniz. Bunu yapmak için ayarlarda hedefin bir derin bağlantısını ekleyebilirsiniz aşağıda gösterildiği gibi gezinme grafiğidir:

<?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"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/settings_nav_graph"
    app:startDestination="@id/settings_fragment_one">

    ...

    <fragment
        android:id="@+id/settings_fragment_two"
        android:name="com.example.google.login.SettingsFragmentTwo"
        android:label="@string/settings_fragment_two" >

        <deepLink
            app:uri="android-app://example.google.app/settings_fragment_two" />
    </fragment>
</navigation>

Ardından, ana sayfada düğmenin onClickListener cihazına aşağıdaki kodu ekleyin parça:

Kotlin

button.setOnClickListener {
    val request = NavDeepLinkRequest.Builder
        .fromUri("android-app://example.google.app/settings_fragment_two".toUri())
        .build()
    findNavController().navigate(request)
}

Java

button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        NavDeepLinkRequest request = NavDeepLinkRequest.Builder
            .fromUri(Uri.parse("android-app://example.google.app/settings_fragment_two"))
            .build();
        NavHostFragment.findNavController(this).navigate(request);
    }
});

İşlem veya hedef kimliklerini kullanarak gezinmenin aksine, modüller arasında olsa bile herhangi bir grafikteki herhangi bir URI'yı kullanabilirsiniz.

URI kullanarak gezinirken geri yığın sıfırlanmaz. Bu davranış, açık derin bağlantı gezinmesinin aksine, arkadaki yığının yerini alır.