android-fragments java.lang.IllegalStateException约束布局没有为片段设置NavController

n1bvdmb6  于 2022-11-13  发布在  Android
关注(0)|答案(4)|浏览(168)

我有一个活动(main),它有三个片段(第一个、第二个和第三个)。我使用<include layout="@layout/content_main"/>将这三个片段包含在我的活动(activity_main.xml)中。content_main.xml使用FragmentContainerViewid = 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中有一个floatingactionbuttonfirst 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的最后一条评论,了解为什么我会出现错误。

8hhllhi2

8hhllhi21#

通过使用导航体系结构组件,NavController负责片段事务和管理后栈,而不是Support FragmentManager
因此,与使用FragmentManager进行传统的framgnet事务不同
您可以通过以下方式从ThridFragment移动到第一个:

Navigation.findNavController(requireView()).navigate(R.id.action_ThirdFragment_to_FirstFragment);

其中,action_ThirdFragment_to_FirstFragment是您在导航图中定义的要从ThridFragment移动到FirstFragment的操作的ID

更新日期:

正如评论中所讨论的,除了在所有动作中将FragmentManager替换为NavController之外;还有一个问题:
导航图中缺少action_FirstFragment_to_ThirdFragment操作。

odopli94

odopli942#

navController = Navigation.findNavController(activity, R.id.nav_host_fragment)
vlurs2pr

vlurs2pr3#

当使用导航组件时,您不应该自己处理事务,而是定义每个片段之间的操作,然后像这样直接访问这些操作

override fun onCreate(){
  val navController = this.findNavController()
  button.setOnClickListener{
     navController.navigate(R.id.action_FirstFragment_to_SecondFragment, null)
  }
}

nav_graph应该是这样的

<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>
sxissh06

sxissh064#

val navController = Navigation.findNavController(requireActivity(), R.id.fragment_container)
navigate.navigate(R.id.fragment)

相关问题