You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 17:45:02