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.


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


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);

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));

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.


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!


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>

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>

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.