我有一个活动(main
),它有三个片段(第一个、第二个和第三个)。我使用<include layout="@layout/content_main"/>
将这三个片段包含在我的活动(activity_main.xml
)中。content_main.xml
使用FragmentContainerView
和id = nav_host_fragment
。这是我的nav_graph.xml
:
<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_graph"
app:startDestination="@id/FirstFragment">
<fragment
android:id="@+id/FirstFragment"
android:name="com.example.makegroups.FirstFragment"
android:label="@string/first_fragment_label"
tools:layout="@layout/fragment_first">
<action
android:id="@+id/action_FirstFragment_to_SecondFragment"
app:destination="@id/SecondFragment" />
</fragment>
<fragment
android:id="@+id/SecondFragment"
android:name="com.example.makegroups.SecondFragment"
android:label="@string/second_fragment_label"
tools:layout="@layout/fragment_second">
<action
android:id="@+id/action_SecondFragment_to_FirstFragment"
app:destination="@id/FirstFragment" />
<action
android:id="@+id/action_SecondFragment_to_ThirdFragment"
app:destination="@id/ThirdFragment" />
</fragment>
<fragment
android:id="@+id/ThirdFragment"
android:name="com.example.makegroups.ThirdFragment"
android:label="@string/third_fragment_label"
tools:layout="@layout/fragment_third">
<action
android:id="@+id/action_ThirdFragment_to_FirstFragment"
app:destination="@id/FirstFragment" />
</fragment>
</navigation>
我的Activity中有一个floatingactionbutton
(first fragment
首先启动),当我点击它时,我打开了third fragment
。在third fragment
上,我有一个按钮(下一步)来导航到first fragment
,当我点击它时,我返回到first fragment
,使用:
Fragment frg = new FirstFragment();
FragmentManager fm = requireActivity().getSupportFragmentManager();
现在(当我在first fragment
中时),我点击按钮next
(另一个按钮导航到second fragment
),然后应用程序崩溃。我发现这个错误:
java.lang.IllegalStateException: View androidx.constraintlayout.widget.ConstraintLayout{c9572fa V.E...... ........ 0,0-1440,2112} does not have a NavController set
为什么我得到这个错误?-我尝试了这些建议here,没有成功。
我使用的是Java。
编辑:阅读@Zain的最后一条评论,了解为什么我会出现错误。
4条答案
按热度按时间8hhllhi21#
通过使用导航体系结构组件,NavController负责片段事务和管理后栈,而不是Support
FragmentManager
。因此,与使用
FragmentManager
进行传统的framgnet事务不同您可以通过以下方式从ThridFragment移动到第一个:
其中,
action_ThirdFragment_to_FirstFragment
是您在导航图中定义的要从ThridFragment
移动到FirstFragment
的操作的ID更新日期:
正如评论中所讨论的,除了在所有动作中将
FragmentManager
替换为NavController
之外;还有一个问题:导航图中缺少
action_FirstFragment_to_ThirdFragment
操作。odopli942#
vlurs2pr3#
当使用导航组件时,您不应该自己处理事务,而是定义每个片段之间的操作,然后像这样直接访问这些操作
nav_graph
应该是这样的sxissh064#