<androidx.fragment.app.FragmentContainerView> so với <Fragment> làm chế độ xem cho Navhost


9

Khi sử dụng androidx.fragment.app.FragmentContainerViewnhư một máy chủ lưu trữ thay vì một fragmentứng dụng thông thường không thể điều hướng đến đích sau khi thay đổi định hướng.

Tôi gặp một lỗi sau: java.lang.IllegalStateException: no current navigation node

Có một gotcha mà tôi nên biết về việc sử dụng nó đúng cách hay cách sử dụng các thành phần điều hướng của tôi là không chính xác?

Hoạt động đơn giản xml với chế độ xem:


...
    <androidx.fragment.app.FragmentContainerView
        android:id="@+id/nav_host_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:defaultNavHost="true"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        app:navGraph="@navigation/nav_simple" />
...

Mã điều hướng:

<?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_legislator.xml"
    app:startDestination="@id/initialFragment">

    <fragment
        android:id="@+id/initialFragment"
        android:name="com.example.fragmenttag.InitialFragment"
        android:label="Initial Fragment"
        tools:layout="@layout/initial_fragment">
        <action
            android:id="@+id/action_initialFragment_to_destinationFragment"
            app:destination="@id/destinationFragment" />
    </fragment>
    <fragment
        android:id="@+id/destinationFragment"
        android:name="com.example.fragmenttag.DestinationFragment"
        android:label="Destination Fragment"
        tools:layout="@layout/destination_fragment" />

</navigation>

Đây là một repo github nơi bạn có thể dễ dàng tái tạo một lỗi: https://github.com/dmytroKarataiev/navhostBug


Bạn cần đặt <fragmentvào a FragmentContainerView.
EpicPandaForce

Câu trả lời:


18

Các no current navigation nodelỗi xảy ra khi không có bộ đồ thị và bạn cố gắng để gọi navigate(). Nếu nó chỉ xảy ra khi bạn đang sử dụng FragmentContainerViewvà sau khi thay đổi cấu hình, thì điều này có liên quan đến lỗi này , đã được sửa và lên lịch phát hành với Điều hướng 2.2.0-rc03.

Để khắc phục sự cố này, bạn có thể chuyển về <fragment>hoặc xóa app:navGraph="@navigation/nav_simple"và thay vào đó gọi navController.setGraph(R.navigation.nav_simple).


Tôi thực sự đã thử phương pháp này và tôi đã nhận được chính xác cùng một lỗi. Bạn có thể kiểm tra repo và cố gắng làm cho nó hoạt động với phương pháp này không?
Dmytro Karataiev

Ngoài ra, sự cố này chỉ xảy ra sau khi thay đổi định hướng. Nó hoạt động tất cả các thời gian khác.
Dmytro Karataiev

Tôi thực sự nghĩ rằng đây không phải là lỗi tương tự, bộ điều khiển điều hướng không phải là null trong câu hỏi của tôi, nhưng ngăn xếp phía sau của nó trống và biểu đồ là null.
Dmytro Karataiev

À, ừ, đó là thông tin khá quan trọng, Âm thanh giống như những gì bạn đang gặp phải là vấn đề khác . Tôi đã cập nhật câu trả lời của mình để thảo luận về những gì đang xảy ra trong vấn đề đó.
ianhanniballake

Cảm ơn bạn, hoàn hảo.
Dmytro Karataiev

0

Tôi không thấy bất kỳ lời giải thích lý do tại sao thay thế Fragment xem với FragmentContainerView . Đây là lý do tại sao thêm câu trả lời này:

Một trong những mẫu phổ biến để lưu trữ các đoạn trong một hoạt động là sử dụng FrameLayout. Cộng đồng Android đã làm điều này trong nhiều năm nhưng điều này sẽ thay đổi ngay bây giờ. Nhóm androidx đã giới thiệu chế độ xem mới này có tên FragmentContainerView để làm điều này cho bạn.

Tất cả những gì bạn phải làm là thay thế FrameLayout của bạn bằng FragmentContainerView và mọi thứ sẽ hoạt động tốt, bạn sẽ không cần thay đổi bất cứ điều gì về cách bạn xử lý các giao dịch phân đoạn.

Những lợi ích thu được ở đây là việc xử lý được cải thiện đối với thứ gọi là thứ tự z cho các mảnh. Đây là ví dụ họ đã sử dụng, nhưng về cơ bản, điều này có nghĩa là, ví dụ, lối ra và nhập chuyển tiếp giữa hai đoạn sẽ không chồng chéo lẫn nhau. Thay vào đó, FragmentContainerView sẽ bắt đầu thoát hoạt hình trước sau đó nhập vào hoạt hình.

Nếu bạn đang hỏi có thể thay thế thẻ này? thì câu trả lời là có. Tất cả những gì bạn phải làm là thêm android: name = "your_group_name" khi xác định FragmentContainerView và nó sẽ sử dụng FragmentTransaction dưới mui xe để xây dựng và hiển thị đoạn của bạn. Điều này có nghĩa là bạn có thể sử dụng các giao dịch mảnh sau này để thay thế nó.

Nguồn

Tài liệu Android


1
Tôi không tin câu trả lời này cho câu hỏi mà tác giả đã hỏi.
AlgoRyan

Đó vẫn là thông tin bổ sung tốt.
Rvb84
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.