<;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
vsFragmentContainerView
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();