Kotlin Android 切换Activity时如何禁止指定元素播放过渡动画?
解决方案
方案1:改用单Activity + 多Fragment架构(最推荐)
你的两个页面共用顶部ActionBar和底部导航栏,天然适合单Activity架构:
- 保留一个主Activity,布局固定包含顶部ActionBar、底部导航按钮,中间区域用FragmentContainerView承载内容
- 原来的「应用列表页」和「设置页」分别改造为独立Fragment
- 点击底部按钮时,仅做Fragment的切换动画,顶部和底部控件固定在Activity中,完全不会参与过渡动画,不会产生额外动效
方案2:保留双Activity架构,使用共享元素过渡
如果不想改现有架构,可通过Android的共享元素转场实现需求,步骤如下:
- 给两个Activity布局里的ActionBar和底部按钮设置相同的
transitionName属性:<!-- 两个Activity的ActionBar都添加该属性 --> <androidx.appcompat.widget.Toolbar android:id="@+id/action_bar" android:transitionName="shared_action_bar" ... /> <!-- 两个Activity的底部导航栏都添加该属性 --> <LinearLayout android:id="@+id/bottom_nav" android:transitionName="shared_bottom_nav" ... /> - 修改跳转代码,携带共享元素参数:
findViewById<Button>(R.id.setting_button).setOnClickListener { val intent = Intent(this, SettingActivity::class.java) // 绑定共享元素 val options = ActivityOptionsCompat.makeSceneTransitionAnimation( this, Pair.create(findViewById(R.id.action_bar), "shared_action_bar"), Pair.create(findViewById(R.id.bottom_nav), "shared_bottom_nav") ).toBundle() startActivity(intent, options) } - 给两个Activity设置转场主题,在
res/values/styles.xml中添加:<style name="AppTransitionTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar"> <item name="android:windowActivityTransitions">true</item> <!-- 自定义中间内容的过渡动画,可根据需求调整 --> <item name="android:windowEnterTransition">@android:transition/slide_right</item> <item name="android:windowExitTransition">@android:transition/slide_left</item> </style> - 将两个Activity的主题指定为上面的
AppTransitionTheme即可。
注意事项
- 共享元素方案需要保证两个Activity的ActionBar、底部导航栏的样式完全一致,否则过渡时会出现突兀的变化
- 共享元素转场最低支持Android 5.0(API 21),如果你的App需要兼容更低版本,只能选择方案1
内容的提问来源于stack exchange,提问作者greg1982
相关产品推荐
相关产品推荐

