Biểu đồ điều hướng lồng nhau

Một chuỗi (series) các đích đến có thể được nhóm thành một biểu đồ lồng nhau (nested graph) trong một biểu đồ điều hướng cha có tên là biểu đồ gốc (root graph). Biểu đồ lồng nhau giúp bạn sắp xếp và tái sử dụng các phần trong giao diện người dùng của ứng dụng, chẳng hạn như quy trình đăng nhập độc lập.

Biểu đồ lồng nhau sẽ đóng gói các đích đến của biểu đồ đó. Giống như biểu đồ gốc, biểu đồ lồng nhau phải có một đích đến được xác định là đích bắt đầu. Các đích đến bên ngoài biểu đồ lồng nhau, chẳng hạn như các đích đến trên biểu đồ gốc, chỉ truy cập biểu đồ lồng nhau này thông qua đích bắt đầu của biểu đồ lồng nhau đó.

Hình 1 cho thấy một biểu đồ điều hướng cho một ứng dụng chuyển tiền đơn giản. Từ đích bắt đầu ở bên trái, biểu đồ này có 2 luồng: một luồng nằm ở trên cùng dùng để gửi tiền và luồng còn lại ở phía dưới dùng để xem số dư tài khoản.

Hình 1. Biểu đồ điều hướng cho ứng dụng chuyển tiền

Để nhóm các đích đến vào một biểu đồ lồng nhau, hãy làm như sau:

  1. Trong Navigation Editor (Trình chỉnh sửa điều hướng), nhấn và giữ phím Shift, sau đó nhấp vào các đích đến mà bạn muốn đưa vào biểu đồ lồng nhau đó.
  2. Nhấp chuột phải để mở trình đơn ngữ cảnh và chọn Move to Nested Graph (Di chuyển đến Biểu đồ lồng nhau) >New Graph (Biểu đồ mới). Các đích đến này sẽ được chứa trong một biểu đồ lồng nhau. Hình 2 cho thấy một biểu đồ lồng trong Navigation Editor (Trình chỉnh sửa điều hướng):

    Hình 2. Biểu đồ lồng ghép trong Graph Editor (Trình chỉnh sửa biểu đồ)
  3. Nhấp vào biểu đồ lồng nhau. Các thuộc tính sau sẽ xuất hiện trong ngăn Attributes (Thuộc tính):

    • Type (Loại), chứa "Biểu đồ lồng nhau"
    • ID (Mã nhận dạng) chứa mã định dạng do hệ thống chỉ định cho biểu đồ lồng nhau. Mã nhận dạng này dùng để tham chiếu đến biểu đồ lồng nhau từ mã của bạn.
  4. Nhấp đúp vào biểu đồ lồng nhau để hiện ra các đích đến của biểu đồ này.

  5. Nhấp vào thẻ Text (Văn bản) để chuyển sang chế độ xem XML. Một biểu đồ điều hướng lồng nhau đã được thêm vào biểu đồ. Biểu đồ điều hướng này có các phần tử navigation riêng, cùng với mã nhận dạng riêng và thuộc tính startDestination trỏ đến đích đến đầu tiên trong biểu đồ lồng nhau:

    <?xml version="1.0" encoding="utf-8"?>
    <navigation xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:android="http://schemas.android.com/apk/res/android"
        app:startDestination="@id/mainFragment">
        <fragment
            android:id="@+id/mainFragment"
            android:name="com.example.cashdog.cashdog.MainFragment"
            android:label="fragment_main"
            tools:layout="@layout/fragment_main" >
            <action
                android:id="@+id/action_mainFragment_to_sendMoneyGraph"
                app:destination="@id/sendMoneyGraph" />
            <action
                android:id="@+id/action_mainFragment_to_viewBalanceFragment"
                app:destination="@id/viewBalanceFragment" />
        </fragment>
        <fragment
            android:id="@+id/viewBalanceFragment"
            android:name="com.example.cashdog.cashdog.ViewBalanceFragment"
            android:label="fragment_view_balance"
            tools:layout="@layout/fragment_view_balance" />
        <navigation android:id="@+id/sendMoneyGraph" app:startDestination="@id/chooseRecipient">
            <fragment
                android:id="@+id/chooseRecipient"
                android:name="com.example.cashdog.cashdog.ChooseRecipient"
                android:label="fragment_choose_recipient"
                tools:layout="@layout/fragment_choose_recipient">
                <action
                    android:id="@+id/action_chooseRecipient_to_chooseAmountFragment"
                    app:destination="@id/chooseAmountFragment" />
            </fragment>
            <fragment
                android:id="@+id/chooseAmountFragment"
                android:name="com.example.cashdog.cashdog.ChooseAmountFragment"
                android:label="fragment_choose_amount"
                tools:layout="@layout/fragment_choose_amount" />
        </navigation>
    </navigation>
    
  6. Trong mã của bạn, hãy chuyển mã nhận dạng tài nguyên của thao tác kết nối biểu đồ gốc với biểu đồ lồng nhau:

    Kotlin

    view.findNavController().navigate(R.id.action_mainFragment_to_sendMoneyGraph)
    

    Java

    Navigation.findNavController(view).navigate(R.id.action_mainFragment_to_sendMoneyGraph);
    

  7. Quay lại thẻ Design (Thiết kế), bạn có thể quay lại biểu đồ gốc bằng cách nhấp vào Root (Gốc).

Tham chiếu các biểu đồ điều hướng khác bằng <included>

Trong biểu đồ điều hướng, bạn có thể tham chiếu các biểu đồ khác bằng cách sử dụng include. Chức năng này tương tự như cách sử dụng một biểu đồ lồng nhau, nhưng include cho phép bạn sử dụng các biểu đồ trong những mô-đun dự án khác hoặc trong các dự án thư viện, như minh họa trong ví dụ dưới đây:

<!-- (root) nav_graph.xml -->
<?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"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/nav_graph"
    app:startDestination="@id/fragment">

    <include app:graph="@navigation/included_graph" />

    <fragment
        android:id="@+id/fragment"
        android:name="com.example.myapplication.BlankFragment"
        android:label="Fragment in Root Graph"
        tools:layout="@layout/fragment_blank">
        <action
            android:id="@+id/action_fragment_to_second_graph"
            app:destination="@id/second_graph" />
    </fragment>

    ...
</navigation>
<!-- included_graph.xml -->
<?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"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/second_graph"
    app:startDestination="@id/includedStart">

    <fragment
        android:id="@+id/includedStart"
        android:name="com.example.myapplication.IncludedStart"
        android:label="fragment_included_start"
        tools:layout="@layout/fragment_included_start" />
</navigation>

Tài nguyên khác

Để tìm hiểu thêm về cách điều hướng, hãy tham khảo thêm những tài nguyên sau đây.

Mẫu

Lớp học lập trình

Video