Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
<;androidx.fragment.app.FragmentContainerView>;vs<;碎片>;作为导航主机的视图_Android_Navigation_Android Architecture Components - Fatal编程技术网

<;androidx.fragment.app.FragmentContainerView>;vs<;碎片>;作为导航主机的视图

<;androidx.fragment.app.FragmentContainerView>;vs<;碎片>;作为导航主机的视图,android,navigation,android-architecture-components,Android,Navigation,Android Architecture Components,当使用androidx.fragment.app.FragmentContainerView作为导航主机而不是常规fragment时,在方向更改后,应用程序无法导航到目标 我得到以下错误: java.lang.IllegalStateException:没有当前导航节点 我应该知道如何正确使用它,还是我使用导航组件的方式不正确 带视图的简单活动xml: ... <androidx.fragment.app.FragmentContainerView android

当使用
androidx.fragment.app.FragmentContainerView
作为导航主机而不是常规
fragment
时,在方向更改后,应用程序无法导航到目标

我得到以下错误:
java.lang.IllegalStateException:没有当前导航节点

我应该知道如何正确使用它,还是我使用导航组件的方式不正确

带视图的简单活动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" />
...

...

当没有图形集且您试图调用
navigate()
时,将出现
无当前导航节点
错误。如果仅在使用
FragmentContainerView
时以及在配置更改后发生,则这将与相关,该版本已修复并计划在导航2.2.0-rc03中发布


要解决此问题,您可以切换回
或删除
app:navGraph=“@navigation/nav_simple”
,而是调用
navController.setGraph(R.navigation.nav_simple)
我看不到任何解释为什么要将片段视图替换为片段容器视图。这就是为什么要添加以下答案:

在活动中承载片段的常见模式之一是使用FrameLayout。安卓社区多年来一直在这样做,但现在情况将有所改变。androidx团队引入了名为FragmentContainerView的新视图来为您实现这一点

你所要做的就是用FragmentContainerView替换你的FrameLayout,一切都应该开箱即用,你不需要改变处理片段事务的方式

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

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

也许您忘记了上面的第三个“false”参数。只能接受这三个参数
onCreateView
fun


图片来源:

我实际上尝试过这种方法,但我得到了完全相同的错误。你能检查一下回购协议并尝试用这种方法使其生效吗?而且,这种崩溃只有在方向改变后才会发生。它在其他时间都有效。我实际上认为这不是同一个错误,导航控制器在我的问题中不是空的,但它的后堆栈是空的,图形是空的。啊,是的,这是非常重要的信息,听起来你正在经历的就是这个。我已经更新了我的答案来讨论这个问题的进展。这应该在官方代码实验室的某个地方解释!还是我错过了呢?你需要把
放进去,我不相信这回答了作者的问题。谢谢!另请参见
proguard rules.pro
中的添加规则。非常感谢您的回答。这有助于解决我现在面临的问题。这并不能解决问题。但是我知道更多关于
FrameLayout
vs
FragmentContainerView
hell的信息。关于android:name=“your\u class\u name”你的“your\u class\u name”应该是什么类?托管活动还是片段?最初的问题是关于,而不是。
<?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>
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    return inflater.inflate(R.layout.frag_splash, container, false)
}
// drawer layout that I pass is the id of the layout in the activity from which I move to fragment//

SacnFragment sacnFragment = new SacnFragment();
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    transaction.replace(R.id.drawer_layout, sacnFragment);
    transaction.addToBackStack(null);
    transaction.commit();