在启动新活动时禁用活动切换动画?

163

我有一个活动,通过按钮点击启动另一个活动。在较新的Android操作系统版本中,默认情况下,操作系统会将新的活动从右到左滑动的方式进行动画。

是否有一种方法可以禁用此动画效果?我只想让新的活动出现而没有任何动画效果。

11个回答

211

使用FLAG_ACTIVITY_NO_ANIMATION标志在启动Activity时可以很好地禁用动画效果。

要禁用在调用finish()时触发的类似动画,即从右侧向左侧滑动的动画,您可以在调用finish()后调用overridePendingTransition(0, 0),下一个动画将被排除。

如果在调用startActivity(...)之后调用overridePendingTransition(0, 0),则它也适用于切换进入动画。


9
请注意,FLAG_ACTIVITY_NO_ANIMATIONoverridePendingTransition仅适用于API Level 5或更高版本。 - dvs
2
当按下返回键从一个活动返回时,这并没有帮助。 - Yar
4
你是最棒的。overridePendingTransition(0, 0) -> 就像神一般。它只覆盖了finish()方法的动画,而不是恢复前一个活动时触发的动画。 - Philipp Jahoda
1
我不喜欢这个答案,因为它没有涵盖由按下“返回”软键引起的过渡。楼主询问如何“禁用”动画,而不是“有选择地告诉应用程序不播放它”。 - 1owk3y
5
如果您想禁用或覆盖“返回”动画,可以在您的活动中重写finish()方法并将该调用与super.finish()一起放入其中。问题解决了。 - Grishka
1
注意:在调用startActivityfinish或其他执行Activity切换的方法(在我的情况下是navigateUpTo())之后,务必调用overridePendingTransition(0,0)。这里顺序非常重要。 - SMBiggs

194

免责声明:这是10年以上的答案。请参考最新的可用文档,因为无论你信不信,事情是会发生变化的。

在我看来,this 这里的答案以最优雅的方式解决了问题..

开发者应该创建一个样式

<style name="noAnimTheme" parent="android:Theme">
  <item name="android:windowAnimationStyle">@null</item>
</style>

然后在清单文件中将其设置为活动或整个应用的主题。
<activity android:name=".ui.ArticlesActivity" android:theme="@style/noAnimTheme">
</activity>

看!简单又容易。。

P.S. 请注明原作者的来源


3
它不能用于后退功能,并且会改变标题栏的外观(使其变小)... - Marek
如果您能详细说明一下,那就太好了,这样我们就可以避免可能出现的问题。 - Ewoks
4
我猜你的问题不是正确地更改了"parent="android:Theme"。你应该用你想要使用的主题来改变它,基本上这段代码只是在一个主题中禁用了特定的动画。例如,使用"Theme.AppCompat.Light.NoActionBar"代替"android:Theme",你就会明白我的意思。希望能帮到你。 - Recomer
就像Mattias所说的那样,在调用finish()之前禁用完成转换调用overridePendingTransition(0, 0) - 6rchid
1
和大多数安卓开发者一样,我也害怕样式和主题。我曾经因为玩弄这些“烫手的东西”而留下了太多的伤疤。 - SMBiggs
显示剩余6条评论

43

申请

startActivity(new Intent(FirstActivity.this,SecondActivity.class));

然后

overridePendingTransition(0, 0);

这将停止动画。


33

在我看来,最好的解决方案是使用 "overridePendingTransition(0, 0);" 来避免在想要 Intent 到一个 Activity 时看到动画:

this.startActivity(new Intent(v.getContext(), newactivity.class));
this.overridePendingTransition(0, 0);

为了在按下返回按钮时不看到动画,请在您的newactivity中重写onPause方法。

@Override
protected void onPause() {
    super.onPause();
    overridePendingTransition(0, 0);
}

21

在启动时只需指定Intent.FLAG_ACTIVITY_NO_ANIMATION标志即可。


17

当禁用“结束Activity时的动画”时,这对我很有效。

@Override
protected void onPause() {
    super.onPause();
    overridePendingTransition(0, 0);
}

这个解决方案适用于以下情况 Intent(context, MyActivity::class.java) intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) startActivity(intent) - Владислав Прасков

10
我目前使用的是4.4.2版本,在启动活动的onCreate()方法中调用overridePendingTransition(0, 0)可以禁用启动动画(在startActivity()后立即调用overridePendingTransition(0, 0)无效)。另外,如另一个答案所述,在finish()后调用overridePendingTransition(0, 0)可禁用关闭动画。
顺便提一下,我发现设置"android:windowAnimationStyle">@null"样式会导致启动活动尝试设置操作栏标题时崩溃。进一步调试后,我发现这种方式会导致window.hasFeature(Window.FEATURE_ACTION_BAR)在Activity的initActionBar()中失败。

1
关于onResume怎么处理?Single Top Activities等等。 - Lassi Kinnunen

9

FLAG_ACTIVITY_NO_ANIMATION可能有效,但当与FLAG_ACTIVITY_CLEAR_TASK和FLAG_ACTIVITY_NEW_TASK组合使用时,对我没有起作用。当我横向导航到其他顶级视图时,我似乎看到了创建一个新任务的动画。

在此情况下有效的方法是,在我的startActivity()调用后立即调用“overridePendingTransition(0,0);”或onPause()后立即调用。两种方法都可以,但在startActivity()之后这样做可以更好地控制我何时想要动画以及何时不想要。


3

我遇到了一个类似的问题,在从一个活动滑动转换到另一个活动时出现了黑屏,使用overridependingtransition。我按照下面的方法操作,它起作用了。

1)在anim文件夹中创建了一个noanim.xml文件。

<?xml version="1.0" encoding="utf-8"?>
<translate 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="@android:integer/config_longAnimTime"
    android:fromYDelta="0%p"
    android:toYDelta="0%p" />

以及使用

overridePendingTransition(R.drawable.lefttorightanim, R.anim.noanim);

第一个参数是我的原始动画,第二个参数是退出动画,作为我的虚拟动画。

你为什么要创建这样的noanim文件?文档中说,如果想要没有动画效果,只需将整数0传递给overridePendingTransition方法,像这样:overridePendingTransition(R.drawable.lefttorightanim, 0); - Duna

3
为了在启动已经存在于堆栈中的活动时避免出现黑色背景,我在onStart()中添加了overridePendingTransition(0,0)
@Override
protected void onStart() {
    overridePendingTransition(0,0);
    super.onStart();

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接