📅  最后修改于: 2023-12-03 15:37:17.386000             🧑  作者: Mango
当你在 Android 应用中引用 Navigation 组件并尝试在运行时导航到新页面时,可能会出现如下错误:
java.lang.IllegalStateException: View androidx.constraintlayout.widget.ConstraintLayout{2131231008 V.E...... ........ 0,0-1080,2040} does not have a NavController set
这意味着未能在该页面上设置 NavController,这是这个页面导航所需的。
为了解决这个问题,你可以尝试以下几个步骤:
NavHostFragment 应该被包含在你的 XML 布局文件之一中。该文件应该包含一个 ID,你可以在代码中引用该 ID 以查找 NavHostFragment。
例如,在以下 XML 中,我们使用 NavHostFragment 显示一个目的地为 R.id.destination_fragment 的 Fragment。
<androidx.constraintlayout.widget.ConstraintLayout
…
/>
<fragment
android:id="@+id/my_nav_host_fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true"
app:navGraph="@navigation/my_nav_graph" />
</androidx.constraintlayout.widget.ConstraintLayout>
这个布局中的“my_nav_host_fragment” ID 将用于查找 NavController。
要使用 NavController,你应该在代码中调用“findNavController()”,并使用包含 NavHostFragment 的视图来调用该方法。这样,NavController 将被正确设置,以便在运行时导航。
例如,在以下代码片段中,我们使用“my_nav_host_fragment” ID 获取 NavHostFragment,并使用该视图调用“findNavController()”。
NavHostFragment navHostFragment = findFragmentById(R.id.my_nav_host_fragment);
NavController navController = navHostFragment.getNavController();
这样 NavController 就被正确设置,你便可以在代码中使用它以进行导航。
最后,确保已添加 Navigation 组件依赖项。在 build.gradle(Module: app) 文件中,应该包含以下依赖项:
dependencies {
implementation "androidx.navigation:navigation-fragment:2.3.2"
implementation "androidx.navigation:navigation-ui:2.3.2"
}
如果你的应用程序在运行时出现“未设置 NavController”错误,则需要确认在视图中正确设置了 NavHostFragment,使用正确的 ID 调用了“findNavController()”,并且已正确设置 Navigation 组件的依赖项。