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 işlemler yapmanıza olanak tanır. Etkinlik hedeflerin kullanılması yararlı olabilir.

Oluşturma ve Kotlin DSL

Gezinme grafiğinize etkinlik hedefi ekleme işlemi, hem Compose'da hem de Kotlin DSL'yi parçalarla kullanırken temelde aynıdır. Çünkü NavGraph öğenizi NavHost composable'ınıza iletirken aynı createGraph() lambda.

Daha fazla bilgi için Parçalar ve Kotlin DSL başlıklı makaleyi inceleyin.

XML

Etkinlik hedefi oluşturma, 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 gösterilir 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, derleme zamanında etkinlik sınıfına bağımlılığınız olmayabilir veya dolaylı intent üzerinden geçmenin dolaylılık düzeyini tercih edebilirsiniz. İ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, userId değerini Güvenli Parametreler veya Bundle ile 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 şu URI değeri oluşturulur: https://example.com?userId=someUser.