Android SDK34+如何实现语言切换重启Activity无过渡动画?
解决SDK 34+中Activity重启无动画过渡的问题
针对你遇到的overridePendingTransition废弃后替换方法无效的问题,提供以下几种可行方案:
方案一:结合Intent标志位与overrideActivityTransition
调整调用时机,同时禁用默认动画标志位,确保覆盖打开和关闭两个过渡阶段:
private void saveLang(String lng) { SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); sharedPreferences.edit().putString("norsegods_langx", lng).apply(); Intent i = new Intent(MainActivity.this, MainActivity.class); // 禁用系统默认的Activity切换动画 i.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { // 覆盖新Activity打开时的过渡动画 overrideActivityTransition(Activity.OVERRIDE_TRANSITION_OPEN, 0, 0); startActivity(i); // 覆盖当前Activity关闭时的过渡动画 overrideActivityTransition(Activity.OVERRIDE_TRANSITION_CLOSE, 0, 0); finish(); } else { startActivity(i); finish(); overridePendingTransition(0, 0); } }
方案二:使用ActivityOptions自定义动画
这种方法兼容全版本,无需区分SDK等级,代码更简洁:
private void saveLang(String lng) { SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); sharedPreferences.edit().putString("norsegods_langx", lng).apply(); Intent i = new Intent(MainActivity.this, MainActivity.class); // 创建无动画的ActivityOptions ActivityOptions options = ActivityOptions.makeCustomAnimation(this, 0, 0); startActivity(i, options.toBundle()); finish(); // 旧版本仍可保留overridePendingTransition做双重保障,或直接省略 if (Build.VERSION.SDK_INT < Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { overridePendingTransition(0, 0); } }
方案三:在主题中全局禁用Activity过渡动画(可选)
如果你的应用中多处需要无动画切换,可在Activity主题中添加以下属性:
<style name="AppTheme.NoAnimation" parent="AppTheme"> <item name="android:windowAnimationStyle">@null</item> <item name="android:activityOpenEnterAnimation">@null</item> <item name="android:activityOpenExitAnimation">@null</item> <item name="android:activityCloseEnterAnimation">@null</item> <item name="android:activityCloseExitAnimation">@null</item> </style>
然后在Manifest中为MainActivity指定该主题,或在代码中动态设置:
setTheme(R.style.AppTheme_NoAnimation);
注意事项
overrideActivityTransition的调用时机很关键,必须在startActivity或finish之前调用,对应指定OVERRIDE_TRANSITION_OPEN或OVERRIDE_TRANSITION_CLOSE。- 添加
Intent.FLAG_ACTIVITY_NO_ANIMATION可以避免系统默认动画干扰,确保自定义设置生效。
内容的提问来源于stack exchange,提问作者Darksymphony
相关产品推荐
相关产品推荐

