Bạn có thể tạo đích đến qua một mảnh (fragment) hoặc hoạt động (activity) hiện có. Bạn cũng có thể dùng Navigation Editor (Trình chỉnh sửa điều hướng) để tạo đích đến mới hoặc tạo phần giữ chỗ rồi sau này thay thế bằng một mảnh hoặc hoạt động.
Tạo đích đến qua một mảnh hoặc hoạt động hiện có
Trong Navigation Editor (Trình chỉnh sửa điều hướng), nếu bạn muốn thêm một loại đích đến hiện có vào biểu đồ điều hướng, hãy nhấp vào biểu tượng New Destination (Đích đến mới) , rồi nhấp vào đích đến tương ứng trong trình đơn thả xuống hiện ra.
Bây giờ, bạn có thể thấy bản xem trước của đích đến đó trong chế độ xem Design (Thiết kế) cùng với XML tương ứng trong chế độ xem Text (Văn bản) của biểu đồ điều hướng.
Tạo đích đến mới cho mảnh
Để thêm một loại đích đến mới trong Navigation Editor (Trình chỉnh sửa điều hướng), hãy làm như sau:
- Trong Navigation Editor (Trình chỉnh sửa điều hướng), hãy nhấp vào biểu tượng New Destination (Đích đến mới)
rồi nhấp vào Create new destination (Tạo đích đến mới).
- Trong hộp thoại New Android Component (Thành phần Android mới) hiện ra, hãy tạo mảnh. Để biết thêm thông tin về mảnh, hãy xem tài liệu về mảnh.
Trở lại Navigation Editor (Trình chỉnh sửa điều hướng), hãy lưu ý rằng Android Studio đã thêm đích đến này vào biểu đồ.
Hình 1 cho thấy ví dụ về một đích đến và một đích đến giữ chỗ.

Tạo đích đến qua DialogFragment
Nếu đã có DialogFragment
, bạn có thể dùng phần tử <dialog>
để thêm hộp thoại vào biểu đồ điều hướng như minh hoạ trong ví dụ sau:
<?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>
Tạo đích đến mới cho hoạt động
Cách tạo đích đến Activity
cũng tương tự như cách tạo đích đến Fragment
. Tuy nhiên, bản chất của đích đến cho Activity
lại rất khác.
Theo mặc định, thư viện Điều hướng đính kèm NavController
vào bố cục Activity
, còn biểu đồ điều hướng đang hoạt động thì thuộc phạm vi của Activity
đang hoạt động. Nếu người dùng chuyển đến một Activity
khác, thì biểu đồ điều hướng hiện tại không còn thuộc phạm vi đó nữa. Tức là đích đến Activity
nên được coi là một điểm cuối trong biểu đồ điều hướng.
Để thêm đích đến Activity
, hãy chỉ định đích đến Activity
đó kèm theo tên lớp đủ điều kiện:
<?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 này tương đương với lệnh gọi startActivity()
sau:
Kotlin
startActivity(Intent(context, DestinationActivity::class.java))
Java
startActivity(new Intent(context, DestinationActivity.class));
Có thể có những trường hợp mà phương pháp này không phù hợp. Ví dụ: có thể bạn không có phần phụ thuộc thời gian biên dịch trên lớp hoạt động (activity class) hoặc có thể bạn muốn chọn cấp độ gián tiếp thông qua ý định ngầm ẩn (implicit intent).
intent-filter
trong mục kê khai của đích đến Activity
cho bạn biết cách định hình cấu trúc cho đích đến Activity
.
Ví dụ: hãy xem xét tệp kê khai sau:
<?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>
Bạn cần định cấu hình đích đến Activity
tương ứng bằng các thuộc tính action
và data
khớp với giá trị trong mục kê khai:
<?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>
Thao tác chỉ định targetPackage
cho applicationId
hiện tại sẽ giới hạn phạm vi của ứng dụng hiện tại, bao gồm cả ứng dụng chính.
Bạn cũng có thể dùng chính cơ chế này cho trường hợp bạn muốn một ứng dụng cụ thể trở thành đích đến. Ví dụ sau đây xác định đích đến là một ứng dụng có applicationId
là 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>
Đối số động
Các ví dụ trước dùng URL cố định để di chuyển đến đích. Cũng có thể bạn phải hỗ trợ các URL động, trong đó thông tin bổ sung được gửi dưới dạng một phần của URL. Ví dụ: bạn có thể gửi mã nhận dạng người dùng trong một URL có định dạng giống như sau https://example.com?userId=<actual user ID>
.
Trong trường hợp này, thay vì thuộc tính data
, hãy dùng dataPattern
.
Sau đó, bạn có thể cung cấp đối số để thay thế cho phần giữ chỗ đã đặt tên trong giá trị 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>
Trong ví dụ này, bạn có thể chỉ định giá trị userId
bằng Safe Args hoặc bằng 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);
Ví dụ này thay thế someUser
bằng {userId}
và tạo ra giá trị URI https://example.com?userId=someUser
.
Đích đến giữ chỗ
Bạn có thể dùng phần giữ chỗ để đại diện cho đích đến chưa triển khai. Phần giữ chỗ đóng vai trò như hình ảnh đại diện cho đích đến. Trong Navigation Editor (Trình chỉnh sửa điều hướng), bạn có thể dùng phần giữ chỗ giống như cách dùng mọi đích đến khác.