Android Studio点击底部菜单同一项后Gerichte Fragment子Fragment不可见如何修复
问题修复方案
问题根因
- FragmentManager使用错误:MealsFragment内的ViewPager子Fragment适配器错误使用了Activity级别的
getSupportFragmentManager,嵌套Fragment必须使用当前父Fragment的getChildFragmentManager才能正确管理子Fragment的生命周期。 - onDestroyView存在错误清理逻辑:MealsFragment的
onDestroyView方法中直接调用了getActivity().getSupportFragmentManager().getFragments().clear(),会将Activity全局管理的所有Fragment直接清空,重入页面时子Fragment会直接丢失。 - 底部导航默认会重复重建当前页:Jetpack Navigation默认配置下,点击已选中的底部导航项会重新创建目标Fragment实例,触发
onDestroyView和onCreateView执行,叠加前两个问题就会出现子Fragment不可见的情况。
修复步骤
步骤1:修正MealsFragment的错误清理逻辑
删除onDestroyView里操作全局Fragment管理器的代码,仅清理自身关联的资源,修改后代码如下:
@Override public void onDestroyView() { super.onDestroyView(); viewPager.setAdapter(null); pageViewModel = null; binding = null; }
步骤2:替换为子Fragment管理器
将MealsFragment的onCreateView方法中初始化SectionsPagerAdapter的代码,把Activity级别的FragmentManager替换为当前Fragment的子Fragment管理器:
// 嵌套子Fragment必须使用getChildFragmentManager管理 sectionsPagerAdapter = new SectionsPagerAdapter(getActivity(), getChildFragmentManager());
如果你的SectionsPagerAdapter支持行为参数,建议显式传入BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT适配最新生命周期规范:
sectionsPagerAdapter = new SectionsPagerAdapter(getActivity(), getChildFragmentManager(), FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
步骤3:禁用底部导航重复点击重建逻辑
在MainActivity的onCreate方法中,底部导航绑定NavController后添加重复选中拦截逻辑,避免重复点击已选中项时重建页面:
NavigationUI.setupWithNavController(binding.navView, navController); // 新增重复点击拦截逻辑 binding.navView.setOnItemSelectedListener(item -> { int currentDestId = navController.getCurrentDestination().getId(); if (item.getItemId() == currentDestId) { // 已经处于当前页面,直接拦截不做处理 return true; } // 非当前页面走默认导航逻辑 return NavigationUI.onNavDestinationSelected(item, navController); });
内容的提问来源于stack exchange,提问作者RobinP2000
相关产品推荐
相关产品推荐

