<androidx.fragment.app.FragmentContainerView> vs <fragment>作为NavHost的视图


9

androidx.fragment.app.FragmentContainerView用作导航主机而不是常规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


你需要把<fragmentFragmentContainerView
EpicPandaForce

Answers:


18

no current navigation node当没有图形设置并且您尝试调用时,将发生错误navigate()。如果仅在使用FragmentContainerView和更改配置后发生,则此错误此bug有关,该bug已修复并计划在Navigation 2.2.0-rc03中发布。

要变通解决此问题,您可以切换回<fragment>或删除,app:navGraph="@navigation/nav_simple"然后致电navController.setGraph(R.navigation.nav_simple)


我实际上尝试了这种方法,但得到了完全相同的错误。您是否可以签出该回购协议并尝试使其与这种方法一起使用?
Dmytro Karataiev,

此外,仅在方向更改后才会发生此崩溃。它在所有其他时间都有效。
Dmytro Karataiev,

我实际上认为这是不一样的错误,我的问题中的nav控制器不为null,但其后堆栈为空且图形为null。
Dmytro Karataiev,

嗯,是的,这是非常重要的信息,听起来您遇到的是这另一个问题。我已经更新了答案,以讨论该问题的发生情况。
ianhanniballake

谢谢,完美。
Dmytro Karataiev,

0

我看不出有任何的解释,为什么替换片段与视图FragmentContainerView。这就是为什么要添加以下答案:

在活动中承载片段的常见模式之一是使用FrameLayout。Android社区已经这样做了多年,但是现在这种情况将会改变。androidx团队引入了这个名为FragmentContainerView的新视图来为您完成此操作。

您所要做的就是用FragmentContainerView替换FrameLayout,一切都应该开箱即用,您无需在处理片段事务的方式上进行任何更改。

此处获得的好处是改进了对片段的z排序的处理。这是他们使用的示例,但是基本上,这意味着,例如,两个片段之间的退出和进入过渡不会相互重叠。相反,此FragmentContainerView将首先开始退出动画,然后再开始输入动画。

如果您要问这个替换标签可以吗?那么答案是肯定的。您需要做的就是在定义FragmentContainerView时添加android:name =“ your_class_name”,它将使用FragmentTransaction在后台进行构建并显示您的片段。这意味着您以后可以使用片段事务来替换它。

资源

Android文件


1
我不相信这能回答作者提出的问题。
AlgoRyan

仍然是很好的附加信息。
Rvb84
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.