Android无法从LocationsFragment返回至ProjectsFragment问题求助
问题分析与解决方案
你遇到的问题核心原因是:当前NavGraph中nav_projects和nav_locations是同级的直接子节点,调用navController.navigate(R.id.nav_locations, projectBundle)时,Navigation默认会将当前的ProjectsFragment从回退栈中移除,直接替换为LocationsFragment,导致回退时无法回到ProjectsFragment。
方案一:在NavGraph中添加显式Action
修改你的mobile_navigation.xml,给nav_projects添加指向nav_locations的action,让Navigation明确知道这是一个层级跳转而非同级替换:
<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/mobile_navigation" app:startDestination="@+id/nav_home"> <fragment android:id="@+id/nav_home" android:name="com.bradley.kon.ui.dashboard.DashboardFragment" android:label="@string/menu_dashboard" tools:layout="@layout/fragment_home" /> <fragment android:id="@+id/nav_projects" android:name="com.bradley.kon.ui.projects.ProjectsFragment" android:label="@string/menu_projects" tools:layout="@layout/fragment_projects" > <!-- 新增action定义 --> <action android:id="@+id/action_nav_projects_to_nav_locations" app:destination="@+id/nav_locations" /> </fragment> <fragment android:id="@+id/nav_locations" android:name="com.bradley.kon.ui.locations.LocationsFragment" android:label="@string/menu_locations" tools:layout="@layout/fragment_locations" /> <fragment android:id="@+id/nav_settings" android:name="com.bradley.kon.ui.settings.SettingsFragment" android:label="@string/menu_settings" tools:layout="@layout/fragment_settings" /> </navigation>
然后修改跳转代码,使用这个action进行导航:
NavController navController = Navigation.findNavController(getActivity(), R.id.nav_host_fragment_content_main); navController.navigate(R.id.action_nav_projects_to_nav_locations, projectBundle);
方案二:使用NavOptions显式保留回退栈
如果不想修改NavGraph,可以在调用navigate时传入NavOptions,强制保留ProjectsFragment在回退栈中:
NavController navController = Navigation.findNavController(getActivity(), R.id.nav_host_fragment_content_main); NavOptions navOptions = new NavOptions.Builder() // 第二个参数为false,表示不弹出nav_projects本身,保留在回退栈中 .setPopUpTo(R.id.nav_projects, false) .build(); navController.navigate(R.id.nav_locations, projectBundle, navOptions);
内容的提问来源于stack exchange,提问作者bradley101
相关产品推荐
相关产品推荐

