Gezinme grafiğinizde, varış noktası etkinlik olabilir. Uygulamanızda tek bir etkinliğin olması en iyi uygulama olsa da, uygulamalar genellikle uygulama içindeki farklı bileşenler veya ekran için ayrı etkinlikler kullanır. Etkinlik hedefleri bu gibi durumlarda yararlı olabilir.
Compose ve Kotlin DSL
Gezinme grafiğinize etkinlik hedefi eklemek, hem Compose'da hem de Kotlin DSL'yi parçalarla kullanırken aynıdır. Bunun nedeni, NavGraph
öğenizi oluşturulan oluşturulmuş NavHost
öğenize aktarırken aynı createGraph()
lambda'yı kullanmanızdır.
Daha fazla bilgi için Kotlin DSL kullanarak programatik olarak grafik oluşturma bölümüne bakın.
XML
activity hedefi oluşturmak, parça hedefi oluşturmaya benzer. Bununla birlikte, bir etkinlik varış noktasının doğası oldukça farklıdır.
Varsayılan olarak, Gezinme kitaplığı NavController
öğesini bir Activity
düzenine ekler ve etkin gezinme grafiğinin kapsamı etkin Activity
olarak ayarlanır. Kullanıcı farklı bir Activity
öğesine giderse geçerli gezinme grafiği artık kapsam dışındadır. Yani Activity
hedefi, gezinme grafiğinde uç nokta olarak kabul edilmelidir.
Bir etkinlik hedefi eklemek için tam nitelikli sınıf adıyla birlikte Activity
hedefini belirtin:
<?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/simpleFragment"> <activity android:id="@+id/sampleActivityDestination" android:name="com.example.android.navigation.activity.DestinationActivity" android:label="@string/sampleActivityTitle" /> </navigation>
Bu XML, aşağıdaki startActivity()
çağrısına eşdeğer:
Kotlin
startActivity(Intent(context, DestinationActivity::class.java))
Java
startActivity(new Intent(context, DestinationActivity.class));
Bu yaklaşımın uygun olmadığı durumlarla karşılaşabilirsiniz. Örneğin, etkinlik sınıfına derleme zamanı bağımlılığınız olmayabilir veya bir implicit intent'i geçmenin dolaylı düzeyini tercih edebilirsiniz. Activity
hedefi için manifest girişindeki intent-filter
, Activity
hedefini nasıl yapılandırmanız gerektiğini belirtir.
Örneğin, şu manifest dosyasını ele alalım:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.navigation.activity">
<application>
<activity android:name=".DestinationActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<data
android:host="example.com"
android:scheme="https" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
</application>
</manifest>
İlgili Activity
hedefinin, manifest girişindekilerle eşleşen action
ve data
özellikleriyle yapılandırılması gerekir:
<?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/simpleFragment"> <activity android:id="@+id/localDestinationActivity" android:label="@string/localActivityTitle" app:action="android.intent.action.VIEW" app:data="https://example.com" app:targetPackage="${applicationId}" /> </navigation>
targetPackage
'in geçerli applicationId
için belirtilmesi, kapsamı ana uygulamayı içeren geçerli uygulamayla sınırlandırır.
Aynı mekanizma, belirli bir uygulamanın hedef olmasını istediğiniz durumlarda kullanılabilir. Aşağıdaki örnekte, bir hedef applicationId
com.example.android.another.app
değerine sahip uygulama olarak tanımlanmaktadır.
<?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/simpleFragment"> <activity android:id="@+id/localDestinationActivity" android:label="@string/localActivityTitle" app:action="android.intent.action.VIEW" app:data="https://example.com" app:targetPackage="com.example.android.another.app" /> </navigation>
Dinamik bağımsız değişkenler
Önceki örneklerde, hedeflere gitmek için sabit URL'ler kullanılmıştır. Ayrıca, ek bilgilerin URL'nin bir parçası olarak gönderildiği dinamik URL'leri desteklemeniz gerekebilir. Örneğin, User-ID'yi https://example.com?userId=<actual user ID>
benzeri bir biçimde URL içinde gönderebilirsiniz.
Bu durumda, data
özelliği yerine dataPattern
özelliğini kullanın.
Daha sonra dataPattern
değeri içindeki adlandırılmış yer tutucularla değiştirilecek bağımsız değişkenler sağlayabilirsiniz:
<?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/simpleFragment"> <activity android:id="@+id/localDestinationActivity" android:label="@string/localActivityTitle" app:action="android.intent.action.VIEW" app:dataPattern="https://example.com?userId={userId}" app:targetPackage="com.example.android.another.app"> <argument android:name="userId" app:argType="string" /> </activity> </navigation>
Bu örnekte, Güvenli Bağımsız Değişkenler veya Bundle
kullanarak bir userId
değeri belirtebilirsiniz:
Kotlin
navController.navigate(
R.id.localDestinationActivity,
bundleOf("userId" to "someUser")
)
Java
Bundle args = new Bundle();
args.putString("userId", "someUser");
navController.navigate(R.id.localDestinationActivity, args);
Bu örnekte, {userId}
yerine someUser
kullanılır ve https://example.com?userId=someUser
URI değeri oluşturulur.