Aktivite hedefleri

Gezinme grafiğinizdeki bir hedef, bir etkinlik olabilir. En iyi seçenek olsa da uygulamanızda tek bir aktivite olması için alıştırma yapın, uygulamalar genellikle ayrı bir etkinlik belirli bileşenler veya ekranlarla ilgili etkinliklerdir. Etkinlik hedeflerin kullanılması yararlı olabilir.

Oluşturma ve Kotlin DSL

Navigasyon grafiğinize bir aktivite hedefi eklemek de hem Compose'da hem de Kotlin DSL'yi parçalarla kullanırken. Çünkü NavGraph öğenizi NavHost composable'ınıza iletirken aynı createGraph() lambda.

Daha fazla bilgi için Kotlin aracını kullanarak programatik olarak grafik oluşturma DSL.

XML

Etkinlik hedefi oluşturmak, parça oluşturmaya benzer. seçeceğiz. Ancak bir aktivite destinasyonunun yapısı yardımcı olur.

Gezinme kitaplığı, NavController öğesini varsayılan olarak bir Activity düzeninde çalışır ve etkin gezinme grafiği, Activity. Kullanıcı farklı bir Activity giderse geçerli gezinme grafiği artık kapsam dışındadır. Bu, Activity hedefi, gezinme grafiğinde bir uç nokta olarak kabul edilmelidir.

Bir etkinlik hedefi eklemek için Activity hedefini tam sınıf adı:

<?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ğerdir:

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 bir derleme süresi bağımlılığı olmayabilir ya da örtülü niyetten geçmenin dolaylı düzeyini tercih ederler. İlgili içeriği oluşturmak için kullanılan Activity hedefi için manifest girişinde intent-filter Activity hedefini nasıl yapılandırmanız gerektiğini belirtir.

Örneğin, aşağıdaki 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 yapılandırılması için Manifest girişindekilerle eşleşen action ve data özellikleri:

<?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 özelliğinin mevcut applicationId değerine ayarlanması, ana uygulamayı da içeren geçerli uygulamanın kapsamını belirler.

Aynı mekanizmayı, belirli bir uygulamanın istediğiniz bir uygulama olmasını istediğiniz seçeceğiz. Aşağıdaki örnekte bir hedefin applicationId/com.example.android.another.app

<?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ılıyordu. En son haberleri sunan, Ayrıca, URL'yi tıklayın. Örneğin, bir URL'de şuna benzer biçimde bir kullanıcı kimliği gönderebilirsiniz: https://example.com?userId=<actual user ID>

Bu durumda, data özelliği yerine dataPattern özelliğini kullanın. Daha sonra, dataPattern değeri:

<?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 birini kullanarak bir userId değeri belirtebilirsiniz. veya Bundle ile:

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 şu URI değeri oluşturulur: https://example.com?userId=someUser.