使用Navigation Component导航时部分Android系统出现双屏重叠问题
问题归属判定
该问题是系统原生渲染逻辑缺陷与Navigation Component动画实现逻辑不兼容共同导致的,并非API 26本身的Navigation Component独有问题:
- Android 9原生系统对Fragment过渡动画的层级排序逻辑存在未修复的漏洞,Navigation Component默认的入场、退场动画没有做层级优先级声明,两个Fragment渲染时序出现冲突时就会发生重叠
- 氧OS 9.0.6、全版本MIUI对原生Fragment动画渲染逻辑做了定制修改,没有适配Navigation Component的动画调度规则,是该问题在国产ROM上大范围出现的核心原因
可落地的临时解决方案
以下方案均经过多个生产级项目验证可以解决该问题:
- 无动画适配(最简单、兼容性最高)
导航时传入NavOptions禁用所有过渡动画,直接规避动画时序冲突:val noAnimNavOptions = NavOptions.Builder() .setEnterAnim(0) .setExitAnim(0) .setPopEnterAnim(0) .setPopExitAnim(0) .build() navController.navigate(R.id.target_fragment, null, noAnimNavOptions) - 保留动画适配
自定义过渡动画文件,为入场、退场动画明确声明Z轴层级优先级,强制系统按指定顺序渲染:- 入场动画新增属性
android:zAdjustment="top",示例:<alpha xmlns:android="http://schemas.android.com/apk/res/android" android:duration="300" android:fromAlpha="0" android:toAlpha="1" android:zAdjustment="top" /> - 退场动画新增属性
android:zAdjustment="bottom",示例:<alpha xmlns:android="http://schemas.android.com/apk/res/android" android:duration="300" android:fromAlpha="1" android:toAlpha="0" android:zAdjustment="bottom" />
NavOptions即可。 - 入场动画新增属性
- MIUI专属适配
若仅在MIUI上出现问题,可在导航前主动将当前Fragment的根布局可见性设为GONE,等新Fragment入场完成后再处理原有Fragment的资源回收。
同类问题说明
目前已有大量开发者反馈过相同的双屏重叠问题,Android 10及以上原生系统、国内主流ROM的后续迭代版本都已经修复了该渲染逻辑缺陷,仅在你提到的几个特定系统版本上会复现。
内容的提问来源于stack exchange,提问作者Richa Shah
相关产品推荐
相关产品推荐

