使用Android Navigation Component跳转报错:View未设置NavController
这个错误我之前也碰到过,核心问题是你的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
相关产品推荐
相关产品推荐

