Wie kann ich die Aktivität ohne Animation in Android wechseln?

164

Wie kann ich das Intent-Flag FLAG_ACTIVITY_NO_ANIMATIONin der AndroidManifest-Datei richtig verwenden? Ich nehme an, mein Problem ist trivial, aber ich kann kein gutes Beispiel oder eine Lösung dafür finden.

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

Der Compliator meldet jedoch keinen Fehler, ist jedoch datanicht korrekt. Ich möchte nur die Animation deaktivieren, falls zwischen Aktivitäten gewechselt wird. Ich kann getWindow().setWindowAnimations(0);eher in onCreate oder onResume verwenden, aber die Verwendung von Flag ist besser, nicht wahr?

Ich kann auch im Code verwenden:

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

Aber ich möchte dieses Flag in Android Manifest verwenden. Deaktivieren der Animation auch für den Fall, dass Sie von der zweiten Aktivität zur ersten zurückkehren.

Woyaru
quelle
Ich habe den Vorschlag gefunden, ein Thema zu verwenden - indem ich Eingabeanimationen für Aktivitäten oder die gesamte Anwendung definiere. Kann mir jemand mehr Informationen darüber geben?
Woyaru

Antworten:

268

Sie können einen Stil erstellen,

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

und legen Sie es als Thema für Ihre Aktivität im Manifest fest:

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

Sie können auch einen Stil definieren, um benutzerdefinierte Ein- und Ausstiegsanimationen anzugeben. http://developer.android.com/reference/android/R.attr.html#windowEnterAnimation

Santosh
quelle
Vielen Dank, dies funktioniert besonders gut für transparente / dialogische Aktivitäten, die von den letzten mit einer anderen Aufgabenaffinität ausgeschlossen sind. Ohne dies zeigte die Animation immer wieder sehr seltsame Ergebnisse für das Öffnen eines Dialogs!
3c71
das scheint nicht mehr für Lollipop / Android 5.0 zu funktionieren?
Kenyee
Ich habe Android 5 und es funktioniert für mich. Mein App-Stil sieht folgendermaßen aus: <style name = "AppTheme" parent = "Theme.AppCompat.Light.DarkActionBar"> <item name = "android: windowAnimationStyle"> @ null </ item> </ style>
eatyourgreens
Funktioniert auch in 6.0 einwandfrei. Ein toller Tipp. Wie ich unten frage, frage ich mich, wie ich die Animation deaktivieren kann, die beim * ersten Start einer App auftritt ... gibt es einen Weg ?!
Fattie
5
wird abstürzen, wenn Sie AppCompatActivity
Mike6679
191

Wenn Ihr Kontext eine Aktivität ist, können Sie overridePendingTransition aufrufen :

Rufen Sie unmittelbar nach einer der Varianten von startActivity (Intent) auf oder beenden Sie, um eine explizite Übergangsanimation anzugeben, die als Nächstes ausgeführt werden soll.

Also programmatisch:

this.startActivity(new Intent(v.getContext(), newactivity.class));
this.overridePendingTransition(0, 0);
Eshirazi
quelle
ist das auch über adb möglich?
Android-Entwickler
@TalAngel the overridePendingTransitionwurde in API Level 5 hinzugefügt. Also nein, es funktioniert nicht auf "jeder" Android-Version, aber ich denke, Sie zielen auf ein höheres API Level als 5.
Bruno Bieri
43

Versuchen Sie diesen Code,

this.startActivity(new Intent(v.getContext(), newactivity.class).addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION));
Bartłomiej Jończy
quelle
1
Dies ist sehr hilfreich, wenn Sie die Aktivität vom Dienst aus starten.
DearDhruv
24

Sie können dies auch einfach in allen Aktivitäten tun, von denen Sie nicht wechseln möchten:

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

Ich mag diesen Ansatz, weil Sie sich nicht mit dem Stil Ihrer Aktivität herumschlagen müssen.


quelle
Ein toller Tipp. Ich frage mich, wie ich die Animation deaktivieren kann, die beim * ersten Start einer App auftritt ... gibt es einen Weg ?!
Fattie
@Fattie Überschreiben Sie die onStart () -Methode Ihrer Startaktivität und platzieren Sie denselben Code darin.
Jawad Adil
4

Hier ist eine Einzeiler-Lösung, die so niedrig ist, wie minSdkVersion 14Sie sie in sich einfügen sollten res/styles.xml:

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

wie so:

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

Prost!

user1506104
quelle
3

Die Linie im Designstil funktioniert einwandfrei, ersetzt jedoch die Animation durch einen weißen Bildschirm. Besonders auf einem langsameren Telefon - es ist wirklich nervig. Wenn Sie also einen sofortigen Übergang wünschen, können Sie diesen im Themenstil verwenden:

<item name="android:windowAnimationStyle">@null</item>
<item name="android:windowDisablePreview">true</item>
Vladimir Demirev
quelle
2

Erstellen Sie Ihren eigenen Stil über Android: Theme

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

Verwenden Sie es dann in einem Manifest wie folgt:

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

Nach dem Start von Intent können Sie diesen Code verwenden:

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

Bei Verwendung funktioniert Intent ohne Animationen oder Übergänge

Faran
quelle