Navigation Component中如何实现用户按下返回键时直接退出应用
以下三种方案均可实现和Activity中调用finish()相同的效果,让用户从个人资料页按返回键直接退出应用:
方案1:XML静态配置导航动作
这是最常用的实现方式,直接在导航图中配置跳转规则即可:
- 找到导航图中登录页目的地对应的
<action>(登录页跳转到个人资料页的动作) - 新增
app:popUpTo="@id/登录页的destination ID"属性,指定回退栈弹出的目标位置 - 新增
app:popUpToInclusive="true"属性,代表将登录页本身也弹出回退栈
配置示例:
<fragment android:id="@+id/loginFragment" android:name="com.yourpackage.LoginFragment"> <action android:id="@+id/action_login_to_profile" app:destination="@id/profileFragment" app:popUpTo="@id/loginFragment" app:popUpToInclusive="true" /> </fragment>
配置完成后跳转时直接调用navController.navigate(R.id.action_login_to_profile)即可。
方案2:代码动态构造导航选项
如果不需要提前配置XML action,可以在跳转时动态构造NavOptions实现相同逻辑:
Kotlin示例:
val navOptions = NavOptions.Builder() .setPopUpTo(R.id.loginFragment, inclusive = true) .build() navController.navigate(R.id.profileFragment, null, navOptions)
Java示例:
NavOptions navOptions = new NavOptions.Builder() .setPopUpTo(R.id.loginFragment, true) .build(); navController.navigate(R.id.profileFragment, null, navOptions);
方案3:清空整个回退栈(登录页为启动页场景适用)
如果登录页是应用的首个启动目的地,也可以直接清空整个回退栈,将个人资料页设为新的根目的地:
// 先弹出整个原有回退栈 navController.popBackStack(navController.graph.startDestinationId, true) // 再跳转至个人资料页 navController.navigate(R.id.profileFragment)
核心逻辑都是将登录页从Navigation的回退栈中完全移除,按下返回键时回退栈为空就会直接退出应用,和Activity场景的finish()效果完全一致。
内容的提问来源于stack exchange,提问作者Always Learner
相关产品推荐
相关产品推荐

