使用registerForActivityResult启动Activity时窗口动画不生效问题
问题分析与解决方法
1. 先检查动画资源是否正确实现右侧滑入逻辑
你需要确保activity_enter.xml和activity_exit.xml的动画代码是正确的右侧滑入/滑出逻辑,比如:
activity_enter.xml(MapActivity从右侧滑入):
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:duration="300" android:fromXDelta="100%p" android:toXDelta="0" /> <alpha android:duration="300" android:fromAlpha="0.0" android:toAlpha="1.0" /> </set>
activity_exit.xml(MapActivity滑出到右侧):
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:duration="300" android:fromXDelta="0" android:toXDelta="100%p" /> <alpha android:duration="300" android:fromAlpha="1.0" android:toAlpha="0.0" /> </set>
如果动画文件本身逻辑错误,无论怎么配置都只会显示默认动画。
2. 修正ActivityOptionsCompat的参数逻辑
ActivityOptionsCompat.makeCustomAnimation的第二个参数是新Activity的进入动画,第三个参数是当前Fragment所在Activity的退出动画,你可能混淆了动画的作用对象:
// 假设当前Activity的退出动画是slide_out_left.xml(从左侧滑出) val options = ActivityOptionsCompat.makeCustomAnimation( requireActivity(), R.anim.activity_enter, // MapActivity的进入动画 R.anim.slide_out_left // 当前Activity的退出动画 ) openMapResultLauncher.launch(intent, options)
如果只给新Activity设置进入动画,当前Activity用默认退出动画,可能会和你想要的效果冲突,导致看起来还是默认动画。
3. 确保主题正确应用且无覆盖
- 检查AndroidManifest中MapActivity的主题配置是否正确:
<activity android:name=".MapActivity" android:theme="@style/MapTheme" />
- 尝试在
MapTheme中显式禁用父主题的默认动画,添加:
<item name="windowAnimationStyle">@style/MapTheme.WindowAnimationStyle</item> <item name="android:windowAnimationStyle">@style/MapTheme.WindowAnimationStyle</item>
(同时添加带android前缀和不带的,避免Material Components主题的属性覆盖)
4. 放弃overridePendingTransition方案
overridePendingTransition必须在startActivity或finish之后立即调用,但使用ActivityResultLauncher.launch时,启动逻辑被封装在内部,你无法在正确时机调用该方法,所以这种方式本身就不会生效。
5. 检查MapActivity的launchMode
如果MapActivity的launchMode设置为singleInstance、singleTask等,系统会跳过默认的过渡动画,需要在Manifest中移除特殊launchMode,或者在启动时显式指定动画。
内容的提问来源于stack exchange,提问作者szaske
相关产品推荐
相关产品推荐

