Android Exit/Enter Transition问题:MainActivity退出转场失效,选中视图仅淡入淡出
嘿,我之前也踩过这个Exit Transition的坑!明明设置了自定义退出转场,结果每次都是默认的交叉淡入淡出,大概率是几个关键配置没做对,咱们一步步来排查解决:
1. 先确认主题的转场配置是否正确
首先,你的MainActivity对应的主题必须开启窗口转场支持,并且明确设置Exit Transition。打开res/values/styles.xml(或对应的夜间模式样式文件),确保主题里有这些配置:
<style name="YourMainActivityTheme" parent="Theme.MaterialComponents.DayNight"> <!-- 必须开启这个,否则所有转场都不生效 --> <item name="android:windowActivityTransitions">true</item> <!-- 设置你想要的退出转场,比如右侧滑动退出 --> <item name="android:windowExitTransition">@transition/slide_right</item> <!-- 如果需要返回时的转场,也可以设置windowReturnTransition --> <item name="android:windowReturnTransition">@transition/slide_left</item> </style>
然后创建对应的transition文件,比如res/transition/slide_right.xml:
<?xml version="1.0" encoding="utf-8"?> <slide xmlns:android="http://schemas.android.com/apk/res/android" android:slideEdge="right" android:duration="300" /> <!-- 可以自定义动画时长 -->
2. 用正确的方式启动下一个Activity
直接调用startActivity(intent)会跳过转场逻辑,必须使用ActivityOptions来触发场景转场动画:
Kotlin示例:
val intent = Intent(this, TargetActivity::class.java) // 非共享元素转场直接使用这个方法创建选项 val options = ActivityOptions.makeSceneTransitionAnimation(this).toBundle() startActivity(intent, options)
Java示例:
Intent intent = new Intent(this, TargetActivity.class); ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(this); startActivity(intent, options.toBundle());
3. 检查是否有代码覆盖了转场设置
最容易忽略的一点:如果你的MainActivity里调用了overridePendingTransition(),这个方法会完全覆盖主题里的转场配置,强制使用你传入的动画资源。比如下面这种代码会导致Exit Transition失效:
// 这种代码要删掉! overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out)
一定要移除这个调用,让主题里的转场配置生效。
4. 排查主题的其他冲突属性
如果你的MainActivity主题设置了android:windowIsTranslucent="true"或者android:windowBackground="@android:color/transparent",透明窗口会干扰转场动画的渲染,导致Exit Transition无法正常显示。确保你的主题是不透明的,或者调整窗口背景为非透明颜色。
最后验证
做完以上步骤后,重启App测试:当你从MainActivity跳转到目标Activity时,应该能看到你设置的Exit Transition效果,而不是默认的交叉淡入淡出。如果还是有问题,可以先把目标Activity的Enter Transition也设置成相同的动画(比如android:windowEnterTransition="@transition/slide_left"),这样能更清晰地看到转场的连贯性。
内容的提问来源于stack exchange,提问作者Epig

