Di grafik navigasi, tujuan dapat berupa aktivitas. Meskipun praktik terbaiknya adalah memiliki satu aktivitas di aplikasi Anda, aplikasi sering menggunakan aktivitas terpisah untuk komponen atau layar yang berbeda dalam aplikasi. Tujuan aktivitas dapat berguna dalam kasus tersebut.
Compose dan DSL Kotlin
Menambahkan tujuan aktivitas ke grafik navigasi pada dasarnya sama
di Compose dan saat menggunakan DSL Kotlin dengan fragmen. Hal ini karena
saat meneruskan NavGraph
ke composable NavHost
, Anda menggunakan lambda
createGraph()
yang sama.
Untuk informasi selengkapnya, lihat Membangun grafik secara terprogram menggunakan DSL Kotlin.
XML
Membuat tujuan aktivitas mirip dengan membuat tujuan fragmen. Namun, sifat tujuan aktivitas sangat berbeda.
Secara default, library Navigation melampirkan NavController
ke
tata letak Activity
, dan grafik navigasi aktif tercakup ke
Activity
yang aktif. Jika pengguna menavigasi ke Activity
yang berbeda, grafik navigasi
saat ini tidak lagi berada dalam cakupan. Ini berarti tujuan
Activity
harus dianggap sebagai endpoint dalam grafik navigasi.
Untuk menambahkan tujuan aktivitas, tentukan Activity
tujuan dengan nama
class-nya yang sepenuhnya memenuhi syarat:
<?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>
XML ini setara dengan panggilan berikut ke startActivity()
:
Kotlin
startActivity(Intent(context, DestinationActivity::class.java))
Java
startActivity(new Intent(context, DestinationActivity.class));
Anda mungkin memiliki kasus saat pendekatan ini tidak sesuai. Misalnya, Anda
mungkin tidak memiliki dependensi waktu kompilasi pada class aktivitas,
atau mungkin lebih memilih level pengalihan melalui intent implisit. intent-filter
dalam entri manifes untuk Activity
tujuan
menentukan cara Anda perlu menyusun tujuan Activity
.
Misalnya, pertimbangkan file manifes berikut:
<?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>
Tujuan Activity
yang sesuai harus dikonfigurasi dengan atribut
action
dan data
yang cocok dengan yang ada dalam entri manifes:
<?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>
Menentukan targetPackage
ke applicationId
saat ini akan membatasi
cakupan ke aplikasi saat ini, yang mencakup aplikasi utama.
Mekanisme yang sama dapat digunakan untuk kasus saat Anda ingin aplikasi tertentu menjadi
tujuannya. Contoh berikut menentukan tujuan untuk menjadi aplikasi dengan
applicationId
dari 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>
Argumen dinamis
Contoh sebelumnya menggunakan URL tetap untuk menavigasi ke tujuan. Anda
mungkin juga perlu mendukung URL dinamis tempat info tambahan dikirimkan sebagai bagian dari
URL. Misalnya, Anda dapat mengirim ID Pengguna dalam URL dengan format yang mirip dengan
https://example.com?userId=<actual user ID>
.
Dalam hal ini, gunakan dataPattern
, bukan atribut data
.
Selanjutnya, Anda dapat menyediakan argumen untuk diganti dengan placeholder yang disebutkan dalam
nilai dataPattern
:
<?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>
Dalam contoh ini, Anda dapat menentukan nilai userId
menggunakan Safe Args
atau dengan Bundle
:
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);
Contoh ini menggantikan someUser
dengan {userId}
dan membuat nilai URI
https://example.com?userId=someUser
.