You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android中设置Activity为singleInstance后丢失自定义动画的问题

解决singleInstance模式下Activity自定义动画丢失的问题

这个问题我做项目时也踩过坑——当把Activity设置为singleInstance启动模式后,它会被分配到独立的任务栈中,系统默认的Activity过渡动画逻辑对跨任务栈场景不生效,所以你在styles.xml里定义的CustomActivityAnimation就失效了。下面给你几个实用的解决方案:

方案一:启动Activity时显式指定过渡动画

这种方法直接可控,适合在特定场景启动Photos Activity时应用动画。在启动Photos的代码里,调用overridePendingTransition手动设置动画:

Intent intent = new Intent(this, Photos.class);
startActivity(intent);
// 第一个参数是新Activity的进入动画,第二个是当前Activity的退出动画
overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left);

如果需要处理返回时的动画,可以在Photos Activity的onBackPressed方法里补充:

@Override
public void onBackPressed() {
    super.onBackPressed();
    overridePendingTransition(R.anim.slide_in_left, R.anim.slide_out_right);
}

方案二:修改主题,添加跨任务栈动画属性

系统针对任务栈之间的切换,提供了专门的动画属性,原来的activityOpenEnterAnimation系列只适合同一任务栈内的跳转。你可以修改CustomActivityAnimation样式,补充跨任务栈的动画配置:

<style name="CustomActivityAnimation" parent="@android:style/Animation.Activity">
    <!-- 同任务栈内的跳转动画 -->
    <item name="android:activityOpenEnterAnimation">@anim/slide_in_right</item>
    <item name="android:activityOpenExitAnimation">@anim/slide_out_left</item>
    <!-- 跨任务栈(如singleInstance)打开时的动画 -->
    <item name="android:taskOpenEnterAnimation">@anim/slide_in_right</item>
    <item name="android:taskOpenExitAnimation">@anim/slide_out_left</item>
    <!-- 跨任务栈关闭时的动画(返回上一个任务栈) -->
    <item name="android:taskCloseEnterAnimation">@anim/slide_in_left</item>
    <item name="android:taskCloseExitAnimation">@anim/slide_out_right</item>
</style>

修改完成后,确保Photos Activity的主题已引用这个动画样式,或者直接把这些属性合并到AppTheme.NoActionBar中。

额外检查:系统动画设置

如果上面的方案都不生效,别忘了检查设备的开发者选项——如果“窗口动画缩放”被设置为0,所有过渡动画都会被禁用,需要调回正常比例(比如1x)。

内容的提问来源于stack exchange,提问作者Mostafa Daif

火山引擎 最新活动