Membuat tujuan

Anda dapat membuat tujuan dari fragmen atau aktivitas yang ada. Anda juga dapat menggunakan Navigation Editor untuk membuat tujuan baru atau membuat placeholder agar nantinya diganti dengan fragmen atau aktivitas.

Membuat tujuan dari fragmen atau aktivitas yang ada

Di Navigation Editor, jika Anda memiliki jenis tujuan yang ada yang ingin Anda tambahkan ke grafik navigasi, klik New Destination , lalu klik tujuan yang sesuai dalam menu drop-down yang muncul. Sekarang Anda dapat melihat pratinjau dari tujuan dalam tampilan Design bersama dengan XML yang sesuai dalam tampilan Text pada grafik navigasi.

Membuat tujuan fragmen baru

Untuk menambahkan jenis tujuan baru menggunakan Navigation Editor, lakukan hal berikut:

  1. Di Navigation Editor, klik ikon New Destination , lalu klik Create new destination.
  2. Dalam dialog New Android Component yang muncul, buat fragmen Anda. Untuk informasi selengkapnya tentang fragmen, lihat dokumentasi fragmen.

Kembali ke Navigation Editor, perhatikan bahwa Android Studio telah menambahkan tujuan ini ke grafik.

Gambar 1 menunjukkan contoh tujuan dan tujuan placeholder.

Gambar 1. Tujuan dan placeholder

Membuat tujuan dari DialogFragment

Jika sudah memiliki DialogFragment, Anda dapat menggunakan elemen <dialog> untuk menambahkan dialog ke grafik navigasi, seperti yang ditunjukkan pada contoh berikut:

<?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/nav_graph">

...

<dialog
    android:id="@+id/my_dialog_fragment"
    android:name="androidx.navigation.myapp.MyDialogFragment">
    <argument android:name="myarg" android:defaultValue="@null" />
        <action
            android:id="@+id/myaction"
            app:destination="@+id/another_destination"/>
</dialog>

...

</navigation>

Membuat tujuan aktivitas baru

Membuat tujuan Activity mirip dengan membuat tujuan Fragment. Namun, sifat tujuan Activity sangat berbeda.

Secara default, library Navigasi melampirkan NavController ke tata letak Activity, dan grafik navigasi aktif tercakup ke Activity yang aktif. Jika pengguna membuka 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 Activity, 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 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.

Tujuan placeholder

Anda dapat menggunakan placeholder untuk merepresentasikan tujuan yang tidak diterapkan. Placeholder berfungsi sebagai representasi visual dari suatu tujuan. Dalam Navigation Editor, Anda dapat menggunakan placeholder seperti yang Anda lakukan pada tujuan lainnya.