Tạo đích đến

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:

  1. 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).
  2. 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ỗ.

Hình 1. Một đích đến và một phầ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 actiondata 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ó applicationIdcom.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.