如何在Android中切换没有动画的活动?


164

如何FLAG_ACTIVITY_NO_ANIMATION在AndroidManifest文件中正确使用Intent标志?我认为我的问题很琐碎,但是我找不到很好的例子或解决方案。

    <intent-filter>
        <data android:name="android.content.Intent.FLAG_ACTIVITY_NO_ANIMATION" />
    </intent-filter>

但是,编译data器未报告任何错误,但不正确。我只想禁用动画,以防在活动之间进行切换。我可以getWindow().setWindowAnimations(0);在onCreate或onResume中使用,但是使用标志是更好的方法,不是吗?

我也可以在代码中使用:

    Intent intent = new Intent(v.getContext(), newactivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
    getContext().startActivity(intent);

但是我想在Android清单中使用此标志。如果从第二个活动返回到第一个活动,也要禁用动画。


我发现建议使用主题-通过定义活动或整个应用程序的进入,退出动画。有人可以给我更多信息吗?
woyaru

Answers:


268

您可以创建样式,

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

并将其设置为清单中您的活动的主题:

   <activity android:name=".ui.ArticlesActivity" android:theme="@style/noAnimTheme">
    </activity>

您还可以定义样式以指定自定义的进入和退出动画。 http://developer.android.com/reference/android/R.attr.html#windowEnterAnimation


谢谢,这非常好用,特别是对于透明/对话主题活动,这些活动被排除在具有不同任务亲缘关系的近期活动之外。没有这个,动画将显示打开对话框的结果非常奇怪!
2013年

这似乎不再适用于Lollipop / Android 5.0?
肯尼2015年

我有Android 5,它适合我。我的应用程序样式如下所示:<style name =“ AppTheme” parent =“ Theme.AppCompat.Light.DarkActionBar”> <item name =“ android:windowAnimationStyle”> @ null </ item> </ style>
eatyourgreens

在6.0中也可以完美工作。一个很好的提示。正如我在下面询问的那样,我想知道如何禁用在*首次启动应用程序时发生的动画...有没有办法?
Fattie

5
如果你扩展AppCompatActivity会崩溃
Mike6679

191

如果您的上下文是活动,则可以调用overridePendingTransition

在startActivity(Intent)中的一种后立即调用,或完成以指定要执行的显式过渡动画。

因此,以编程方式:

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

是否也可以通过adb来做到这一点?
Android开发人员

@TalAngel将overridePendingTransition在API级别增加5因此,没有它的“每一个” Android版本没有工作,但我猜你的目标更高的API的水平,那么5
布鲁诺BIERI

43

试试这个代码,

this.startActivity(new Intent(v.getContext(), newactivity.class).addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION));

1
从服务开始活动时,这确实有帮助。
DearDhruv '16

24

您也可以在所有不想从中过渡的活动中执行此操作:

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

我喜欢这种方法,因为您不必弄乱自己的活动风格。


一个很好的提示。我不知道如何禁用*首次启动应用程序时发生的动画...有没有办法?
Fattie

@Fattie覆盖启动活动的onStart()方法,并在其中放置相同的代码。
贾瓦德·阿迪尔


4

这是一种单线解决方案,其工作成本低至minSdkVersion 14您应该插入其中的程度res/styles.xml

<item name="android:windowAnimationStyle">@null</item>

像这样:

<resources>
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        ...
        <item name="android:windowAnimationStyle">@null</item>
    </style>
    ...
</resources>

干杯!


3

主题样式的线条效果很好,但是用白色屏幕代替了动画。尤其是在速度较慢的手机上-确实很烦人。因此,如果您想要即时转换-您可以在主题样式中使用它:

<item name="android:windowAnimationStyle">@null</item>
<item name="android:windowDisablePreview">true</item>

2

创建自己的样式来替代android:Theme

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

然后像这样在清单中使用它:

<activity android:name=".MainActivity"
    android:theme="@style/noAnimationStyle">
</activity>

0

启动意图后,您可以使用以下代码:

Intent intent = new Intent(Activity1.this, Activity2.class);
overridePendingTransition(0, 0);
intent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
startActivity(intent);

如果使用,则意图将不具有动画或过渡效果

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.