Android Navigation报错:MainActivity不支持动作无法跳转登录Fragment
错误根源
你当前的报错是导航图配置逻辑错误导致的:
- 你把承载
NavHost的MainActivity本身加入了导航图的目的地列表,还将它设为了起始目的地,但导航图的作用是管理NavHost内部的页面(绝大多数场景为Fragment),不能将宿主Activity作为导航目的地处理,它天然是终端节点,不支持配置跳转Action。 - 你在MainActivity的
onCreate中直接调用navigate跳转,此时导航图还未完成初始化,也会触发异常。
修复步骤
第一步:修正导航图配置
直接删除导航图里的MainActivity节点,将起始目的地改为loginFragment即可,修改后的导航图代码如下:
<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/navigation" app:startDestination="@id/loginFragment"> <fragment android:id="@+id/loginFragment" android:name="com.exa.activities.login.LoginFragment" android:label="login_fragment" tools:layout="@layout/login_fragment" > <action android:id="@+id/action_loginFragment_to_registrationFragment" app:destination="@id/registrationFragment" /> </fragment> <!-- 补充注册Fragment、登录后跳转的首页Fragment等其他目的地节点即可 --> <fragment android:id="@+id/registrationFragment" android:name="com.exa.activities.login.RegistrationFragment" android:label="registration_fragment" tools:layout="@layout/registration_fragment" /> </navigation>
小提示:确认你的
activity_main.xml里的NavHostFragment节点已经配置了app:navGraph属性指向你修改后的导航图文件,否则导航框架无法加载页面。
第二步:简化MainActivity代码
你不需要手动调用navigate跳转到登录页,导航图会自动加载你设置的startDestination也就是LoginFragment,修改后的MainActivity代码:
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) supportActionBar?.hide() // 删掉手动调用navController.navigate的代码即可,导航框架会自动加载起始目的地 } }
后续登录跳转逻辑
用户登录成功之后,你只需要在LoginFragment里拿到NavController,调用跳转方法到你登录后的首页Fragment即可,示例代码:
// LoginFragment中登录成功后的跳转逻辑 val navController = findNavController() navController.navigate(R.id.action_loginFragment_to_homeFragment)
如果需要登录成功后无法按返回键退回登录页,给LoginFragment跳转到首页的Action加上这两个属性即可:
<action android:id="@+id/action_loginFragment_to_homeFragment" app:destination="@id/homeFragment" app:popUpTo="@id/loginFragment" app:popUpToInclusive="true" />
内容的提问来源于stack exchange,提问作者confusedstudent
相关产品推荐
相关产品推荐

