NavHost에 대한보기 인 <androidx.fragment.app.FragmentContainerView> vs <fragment>


9

사용하는 경우 androidx.fragment.app.FragmentContainerView대신 일반의 navHost으로 fragment응용하는 방향 변경 후 목적지로 이동 할 수 없습니다.

다음과 같은 오류가 발생합니다. java.lang.IllegalStateException: no current navigation node

제대로 사용하기 위해 알아야 할 사항이 있습니까, 아니면 내비게이션 구성 요소를 사용하는 방법이 올바르지 않습니까?

보기가있는 간단한 활동 xml :


...
    <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" />
...

네비게이션 코드 :

<?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>

다음은 버그를 쉽게 재현 할 수있는 github 저장소입니다 : https://github.com/dmytroKarataiev/navHostBug


당신은을 둘 필요가 <fragment으로 FragmentContainerView.
EpicPandaForce

답변:


18

no current navigation node이 더 그래프 세트 없다 당신이 전화를하려고 할 때 오류가 발생합니다 navigate(). FragmentContainerView구성 변경을 사용할 때 와 변경 한 후에 만 발생 하는 경우이 버그 와 관련이 있습니다. 이 버그 는 Navigation 2.2.0-rc03으로 수정되어 릴리스 될 예정입니다.

이 문제를 해결하려면 다음 중 하나로 전환 할 수 있습니다 <fragment>또는 제거 app:navGraph="@navigation/nav_simple"하고 대신 전화 navController.setGraph(R.navigation.nav_simple).


실제로이 방법을 시도했지만 정확히 동일한 오류가 발생했습니다. 레포를 확인 하고이 방법으로 작동하도록 시도 할 수 있습니까?
Dmytro Karataiev

또한이 충돌은 방향 변경 후에 만 ​​발생합니다. 다른 모든 시간에 작동합니다.
Dmytro Karataiev

실제로 이것은 동일한 오류가 아니라고 생각합니다. 내 컨트롤러는 내 질문에 null이 아니지만 후면 스택이 비어 있고 그래프가 null입니다.
Dmytro Karataiev

아, 그래, 그것은 매우 중요한 정보입니다. 당신이 겪고있는 것과 같은 소리가 다른 문제 입니다. 그 문제에 대해 논의하기 위해 답변을 업데이트했습니다.
ianhanniballake

고마워, 완벽 해
Dmytro Karataiev 's November

0

Fragment view를 FragmentContainerView로 바꾸는 이유에 대한 설명이 없습니다 . 이것이이 답변을 추가하는 이유입니다.

활동에서 프래그먼트를 호스팅하는 일반적인 패턴 중 하나는 FrameLayout을 사용하는 것입니다. 안드로이드 커뮤니티는 수년 동안 이것을 해왔지만 지금은 변할 것입니다. androidx 팀은이를 위해 FragmentContainerView라는 새로운 뷰를 도입했습니다.

FrameLayout을 FragmentContainerView로 바꾸고 모든 것이 즉시 작동해야하므로 조각 트랜잭션을 처리하는 방식에 대해 아무것도 변경할 필요가 없습니다.

여기에서 얻을 수있는 이점은 조각에 대한 z 순서 지정의 개선 된 처리입니다. 여기에 그들이 사용한 예제가 있지만 기본적으로 이것은 예를 들어 두 조각 사이의 종료 및 입력 전환이 서로 겹치지 않음을 의미합니다. 대신이 FragmentContainerView는 먼저 종료 애니메이션을 시작한 다음 enter 애니메이션을 시작합니다.

이 태그를 교체 할 수 있습니까? 대답은 '예'입니다. FragmentContainerView를 정의 할 때 android : name = "your_class_name"을 추가하기 만하면 후드 아래에서 FragmentTransaction을 사용하여 프래그먼트를 빌드하고 표시 할 수 있습니다. 이는 나중에 조각 트랜잭션을 사용하여이를 대체 할 수 있음을 의미합니다.

출처

안드로이드 문서


1
나는 이것이 저자가 묻는 질문에 대답하지 않는다고 생각합니다.
AlgoRyan

여전히 좋은 추가 정보입니다.
Rvb84
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.