Android Navigation跳转首页后返回仍回到登录注册页问题求助
问题解决方法
你遇到的问题核心原因是导航跳转配置缺失popUpTo属性,仅配置popUpToInclusive无法生效,具体修改方案如下:
1. 修正导航图跳转配置
跳转到HomeFragment的两个action都需要补充app:popUpTo属性,指定需要清空的回退栈范围,直接指定导航图的id即可清空所有登录注册相关的页面回退栈:
<?xml version="1.0" encoding="utf-8"?> <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/nav_graph" app:startDestination="@id/registerFragment"> <fragment android:id="@+id/loginFragment" android:name="com.mml.mymall.LoginFragment" android:label="fragment_login" tools:layout="@layout/fragment_login"> <action android:id="@+id/action_loginFragment_to_registerFragment" app:destination="@id/registerFragment" app:enterAnim="@anim/slide_in_left" app:exitAnim="@anim/slide_in_right" app:popEnterAnim="@anim/slide_out_right" app:popExitAnim="@anim/slide_out_left" /> <!-- 补充app:popUpTo属性 --> <action android:id="@+id/action_loginFragment_to_homeFragment" app:destination="@id/homeFragment" app:launchSingleTop="true" app:popUpTo="@id/nav_graph" app:popUpToInclusive="true" /> <action android:id="@+id/action_loginFragment_to_resetPasswordFragment" app:destination="@id/resetPasswordFragment" app:popUpTo="@id/loginFragment" /> </fragment> <fragment android:id="@+id/registerFragment" android:name="com.mml.mymall.RegisterFragment" android:label="fragment_register" tools:layout="@layout/fragment_register"> <action android:id="@+id/action_registerFragment_to_loginFragment" app:destination="@id/loginFragment" app:enterAnim="@anim/slide_in_left" app:exitAnim="@anim/slide_out_right" app:popEnterAnim="@anim/slide_out_right" app:popExitAnim="@anim/slide_out_left" /> <!-- 补充app:popUpTo属性,同时建议把launchSingleTop也设为true --> <action android:id="@+id/action_registerFragment_to_homeFragment" app:destination="@id/homeFragment" app:launchSingleTop="true" app:popUpTo="@id/nav_graph" app:popUpToInclusive="true" /> </fragment> <fragment android:id="@+id/homeFragment" android:name="com.mml.mymall.HomeFragment" android:label="fragment_home" tools:layout="@layout/fragment_home"/> <fragment android:id="@+id/resetPasswordFragment" android:name="com.mml.mymall.ResetPasswordFragment" android:label="fragment_reset_password" tools:layout="@layout/fragment_reset_password" /> </navigation>
2. 优化MainActivity已登录状态跳转逻辑
原有逻辑会直接将HomeFragment叠加在默认启动的RegisterFragment回退栈之上,导致已登录用户打开应用后点击返回仍会回到注册页,修改为直接修改导航图起始页即可:
public class MainActivity extends AppCompatActivity { private NavController navController; private FirebaseAuth firebaseAuth; @Override protected void onCreate(Bundle savedInstanceState) { setTheme(R.style.Theme_MyMall); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); firebaseAuth = FirebaseAuth.getInstance(); FirebaseUser currentUser = firebaseAuth.getCurrentUser(); NavHostFragment navHostFragment = (NavHostFragment) getSupportFragmentManager().findFragmentById(R.id.nav_host_fragment_container); navController = navHostFragment.getNavController(); // 修改此处逻辑 if (currentUser != null) { NavGraph navGraph = navController.getNavInflater().inflate(R.navigation.nav_graph); navGraph.setStartDestination(R.id.homeFragment); navController.setGraph(navGraph); } else { navController.setGraph(R.navigation.nav_graph); } } @Override public boolean onSupportNavigateUp() { return navController.navigateUp() || super.onSupportNavigateUp(); } }
原理说明
popUpToInclusive属性需要配合popUpTo使用才会生效:
popUpTo用于指定回退栈需要弹出到的目标页面idpopUpToInclusive="true"代表弹出时连popUpTo指定的目标页面也一起移除
你之前仅配置了popUpToInclusive没有指定popUpTo,系统无法识别需要清空的回退栈范围,因此登录注册页面会一直留在回退栈中,点击返回自然会回到对应页面。
内容的提问来源于stack exchange,提问作者Dr Mido
相关产品推荐
相关产品推荐

