升级appcompat 1.2.0到1.3.1出现ID不指向Activity内View错误如何解决
问题根因
appcompat从1.3.0版本开始调整了Fragment与宿主Activity的生命周期调度时序,你在起始目的地Fragment的onCreateView阶段调用Navigation.findNavController时,宿主Activity的布局还未完成挂载,R.id.nav_host_fragment还未被注册到Activity的View树中,因此触发ID找不到的报错。
适配步骤
我自己的项目已经完成过1.3.1版本的升级,按以下步骤修改即可解决问题:
- 调整NavController获取时机:将原来写在
onCreateView里的获取逻辑迁移到onViewCreated生命周期方法中执行,onViewCreated触发时宿主Activity的布局已经完成渲染,View ID可以正常检索,修改后的代码示例:
@Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); // 这里用requireActivity()代替getActivity()避免空指针风险 navController = Navigation.findNavController(requireActivity(), R.id.nav_host_fragment); }
- (可选优化)更稳妥的NavController获取方式:如果当前Fragment属于NavHostFragment管理的子节点,不需要通过Activity检索,直接基于当前Fragment的根View获取即可,兼容更高版本的生命周期规则:
navController = Navigation.findNavController(view);
- (可选规范优化)将activity_main.xml中原来的
<fragment>标签替换为官方推荐的FragmentContainerView作为NavHost载体,appcompat 1.3.0+对该组件的兼容性更好,修改后的布局代码:
<androidx.fragment.app.FragmentContainerView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/nav_host_fragment" android:name="androidx.navigation.fragment.NavHostFragment" app:navGraph="@navigation/nav_graph" app:defaultNavHost="true" />
修改完成后重新编译运行即可,不需要降级appcompat版本。
内容的提问来源于stack exchange,提问作者lcj
相关产品推荐
相关产品推荐

