在将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
答案 0 :(得分:13)
我看不到任何解释为何将 Fragment 视图替换为 FragmentContainerView 。这就是为什么要添加以下答案:
在活动中承载片段的常见模式之一是使用FrameLayout。 Android社区已经这样做了多年,但是现在这种情况将会改变。 androidx团队引入了这个名为FragmentContainerView的新视图来为您完成此操作。
所有您需要做的就是用FragmentContainerView替换FrameLayout,一切应该可以立即使用,在处理片段交易的方式上,您无需进行任何更改。
此处获得的好处是改进了对片段的z排序的处理。这是他们使用的示例,但是基本上,这意味着,例如,两个片段之间的退出和进入过渡不会彼此重叠。相反,此FragmentContainerView将首先开始退出动画,然后再进入输入动画。
如果您要问这个替换标签可以吗?那么答案是肯定的。您需要做的就是在定义FragmentContainerView时添加android:name =“ your_class_name”,它将使用FragmentTransaction在后台进行构建并显示您的片段。这意味着您以后可以使用片段事务来替换它。
答案 1 :(得分:5)
当没有图形设置并且您尝试调用no current navigation node
时,发生navigate()
错误。如果仅在使用FragmentContainerView
并进行配置更改后才发生,那么这将与this bug有关,该问题已修复并计划在Navigation 2.2.0-rc03中发布。
要变通解决此问题,您可以切换回<fragment>
或删除app:navGraph="@navigation/nav_simple"
,然后致电navController.setGraph(R.navigation.nav_simple)
。
答案 2 :(得分:0)
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.frag_splash, container, false)
}
也许您忘记了上面的第三个“ false”参数。这三个参数onCreateView
乐趣只能被接受。
图片来自:https://developer.android.com/reference/androidx/fragment/app/FragmentContainerView
答案 3 :(得分:0)
// 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();