You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Android Navigation Component跳转报错:View未设置NavController

解决Android Navigation Component中“View does not have a NavController set”错误

这个错误我之前也碰到过,核心问题是你的NavHostFragment没有被正确初始化,导致LoginFragment里的按钮找不到对应的导航控制器。咱们一步步来修复:

1. 修复Activity中NavHostFragment的声明方式

你当前用FrameLayout来承载NavHostFragment,但app:navGraph和app:defaultNavHost这些属性是专属NavHostFragment的,FrameLayout本身无法识别这些配置,这就导致整个导航体系没有正确建立。

把Activity布局里的FrameLayout替换成<fragment>标签:

<fragment
    android:id="@+id/fragment_container"
    android:name="androidx.navigation.fragment.NavHostFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    app:navGraph="@navigation/main_navigation"
    app:defaultNavHost="true"/>

注意:确保android:name指向的是androidx.navigation.fragment.NavHostFragment(现在大部分Android项目都使用AndroidX),而非旧的support库类。

2. 完善导航图(nav_graph.xml)的节点

看你提供的导航图,只定义了loginFragment,但跳转目标signUpFragment并没有在导航图中声明——即使修复了NavController的问题,跳转还是会失败。需要把signUpFragment添加到导航图中:

<navigation xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    app:startDestination="@id/loginFragment">

    <fragment
        android:id="@+id/loginFragment"
        android:name="org.test.oe.app.core.auth.login.LoginFragment"
        android:label="login_fragment"
        tools:layout="@layout/login_fragment">
        <action
            android:id="@+id/action_loginFragment_to_signUpFragment"
            app:destination="@id/signUpFragment" />
    </fragment>

    <!-- 添加SignUpFragment的节点,注意替换成你实际的类路径和布局 -->
    <fragment
        android:id="@+id/signUpFragment"
        android:name="org.test.oe.app.core.auth.signup.SignUpFragment"
        android:label="signup_fragment"
        tools:layout="@layout/sign_up_fragment"/>

</navigation>

3. (可选)如果坚持用FrameLayout动态添加NavHostFragment

如果你因为某些原因必须用FrameLayout作为容器,那需要在Activity的onCreate方法中手动添加NavHostFragment,而非依赖xml属性:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.your_activity_layout)

    // 手动初始化并添加NavHostFragment
    val navHostFragment = NavHostFragment.create(R.navigation.main_navigation)
    supportFragmentManager.beginTransaction()
        .replace(R.id.fragment_container, navHostFragment)
        .setPrimaryNavigationFragment(navHostFragment) // 等价于xml中的app:defaultNavHost="true"
        .commit()
}

做完以上几步,再点击跳转按钮应该就能正常导航到SignUpFragment了。

内容的提问来源于stack exchange,提问作者Masquerade

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:02:48