使用Navigation Component跳转splash Fragment前出现3秒空白屏的问题咨询
空白屏的根本原因
这是Navigation Component的典型使用误区,你看到的3秒空白完全是多余的跳转逻辑导致的:
- 你没有把splash设置为导航图的默认起始目的地,NavHostFragment初始化时,会先加载你在导航图里之前配置的旧起始页(比如首页Fragment),等旧页面的Fragment事务完成、NavHost可以响应导航指令了,你写的
navController.navigate(R.id.splashFragment)才会执行,把旧页面替换成splash。整个加载旧页面、排队事务、再替换的过程,就是你看到的splash出现前的空白等待。 - 你获取NavController、发起导航的时机太早:NavHostFragment还没完成和FragmentManager的绑定、还没完成首轮布局渲染时,你就提前调用导航方法,指令会被一直缓存排队,直到NavHost完全可用了才执行,进一步拉长了空白时长。
具体修正方案
1. 删掉所有冗余的手动导航代码,直接把splash设为导航起始页
根本不需要在Activity里手动写代码跳转splash,只要改导航图配置就行:
- 打开项目里对应的Navigation XML文件(一般存放在
res/navigation/目录下),修改<navigation>根节点的app:startDestination属性,直接指向splash Fragment的id:
<navigation xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/main_nav_graph" app:startDestination="@id/splashFragment"> <!-- 直接将splash设为默认起始页 --> <!-- splash节点保持原有配置即可 --> <fragment android:id="@+id/splashFragment" android:name="com.yourapp.SplashFragment" tools:layout="@layout/fragment_splash" /> <!-- 其他导航目的地的配置不需要改动 --> </navigation>
- 把Activity里所有手动获取NavHostFragment、获取NavController、调用
navController.navigate(R.id.splashFragment)的代码全部删除。只要导航图配置正确,NavHostFragment初始化时会自动加载splash Fragment,没有中间的额外跳转步骤,自然不会出现等待的空白屏。
2. 校验布局中NavHost的基础配置
检查Activity布局里承载导航的Fragment容器,确保正确关联了导航图,配置不全也会拖慢初始化速度:
<androidx.fragment.app.FragmentContainerView android:id="@+id/nav_host_fragment" android:name="androidx.navigation.fragment.NavHostFragment" android:layout_width="match_parent" android:layout_height="match_parent" app:navGraph="@navigation/main_nav_graph" <!-- 确保关联刚才修改的导航图 --> app:defaultNavHost="true" />
3. 排查额外的渲染卡点
改完上面的配置如果还有短暂空白,检查两个容易踩的细节:
- 不要在splash Fragment的
onCreate、onCreateView方法里做耗时操作(比如初始化SDK、拉取接口配置),这类操作会直接阻塞Fragment的布局渲染,把耗时逻辑挪到onViewCreated之后的子线程/协程里执行,不要卡主线程渲染流程。 - 不要给splash页面加无意义的延时占位,也不要给导航切换配置过长的过渡动画。
内容的提问来源于stack exchange,提问作者Anwar Zahid
相关产品推荐
相关产品推荐

