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

Dmy*_*iev 29 navigation android android-architecture-components

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" />
...
Run Code Online (Sandbox Code Playgroud)

导航代码:

<?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>
Run Code Online (Sandbox Code Playgroud)

这是一个 github 存储库,您可以在其中轻松重现错误:https : //github.com/dmytroKarataiev/navHostBug

ian*_*ake 34

no current navigation node当没有图形组,并尝试调用发生错误navigate()。如果它仅在您使用时FragmentContainerView和配置更改后发生,那么这可能与此错误有关,该错误已修复并计划与 Navigation 2.2.0-rc03 一起发布。

要解决此问题,您可以切换回<fragment>或删除app:navGraph="@navigation/nav_simple"并改为调用navController.setGraph(R.navigation.nav_simple).

  • 我实际上尝试了这种方法,但得到了完全相同的错误。您能否查看该存储库并尝试使其与这种方法一起工作? (2认同)

Mic*_*lsx 26

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

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

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

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

如果你问这个可以代替标签吗?那么答案是肯定的。您所要做的就是在定义 FragmentContainerView 时添加 android:name="your_class_name" ,它会在引擎盖下使用 FragmentTransaction 来构建和显示您的片段。这意味着您可以稍后使用片段事务来替换它。

来源

安卓文档

  • 我不认为这回答了作者提出的问题。 (3认同)