Wie kann ich dem Ende der Aktivität eine Animation hinzufügen ()

98

Ich verwende overridePendingTransition, wenn meine Aktivität erstellt wird und das gut funktioniert. Ich kann sehen, dass das Einblenden gut funktioniert, aber wenn ich versuche, das Ende der Aktivität zu animieren, wird immer noch die Standardfolie von rechts nach links ausgeführt.

Ich habe zuerst versucht, die Out-Animation zu definieren, wenn ich die Aktivität wie folgt starte:

Intent myIntent = new Intent(a, SkdyAlert.class);
    myIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
    a.startActivity(myIntent);
    if (android.os.Build.VERSION.SDK_INT > android.os.Build.VERSION_CODES.DONUT) {
        AnimationHelper.overridePendingTransition(a, R.anim.fadein, R.anim.fadeout);
    }

Dann habe ich es versucht, als ich die Aktivität beendet habe

okBtn.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            finish();
            if (android.os.Build.VERSION.SDK_INT > android.os.Build.VERSION_CODES.DONUT) {
                AnimationHelper.overridePendingTransition(activity, 0, R.anim.fadeout);
            }
        }
    });

Keiner dieser Ansätze verhindert jedoch die Folie "von rechts nach links" für die Exit-Animation. Irgendwelche Ideen, was ich falsch mache?

b-ryce
quelle

Antworten:

227

Ich überschreibe den ausstehenden Übergang direkt nach dem Aufruf von finish ().

In meinem Fall habe ich es getan, um Übergänge zu vermeiden.

finish();
Details.this.overridePendingTransition(R.anim.nothing,R.anim.nothing);

Ordnung ist wichtig :)

Goofyahead
quelle
5
mit "Details" nennt @Goofyahead seine einschließende Aktivität - ymmv. Diese Technik funktionierte für mich, um eine Animation von Theme.Dialog auf 2.x zu ersetzen, aber nicht 3.x oder 4.x
larham1
8
Wie sieht es R.anim.nothingaus?
Sandalone
Verwenden Sie die Antwort von @Felipe Micaroni Lalli, 0 bedeutet keine Animation.
Yeung
Das hat mir auch geholfen. Es erklärt, wie Sie Ihre eigenen Animationen definieren: stackoverflow.com/questions/5151591/…
Adam
23
Sie können die finish()Methode überschreiben , um Übergänge in allen Fällen zu vermeiden (Zurück-Taste gedrückt, als Beispiel): @Override public void finish() { super.finish(); overridePendingTransition(0, 0); }
Eugenek
29

Diese Frage wurde bereits beantwortet. Der effizienteste Weg, eine Animation beim Beenden einer Aktivität zu platzieren, besteht darin, die Methode "finish ()" der zugehörigen Aktivität zu überschreiben:

@Override
public void finish() {
    super.finish();
    overridePendingTransition(R.anim.hold, R.anim.slide_out_bottom);
}
Bahadir Tasdemir
quelle
24

Ich würde vorschlagen, die Methode isFinishing () zu verwenden, um die Animationen bei onPause zu konfigurieren, anstatt finish () aufzurufen.

@Override
protected void onPause() {
    super.onPause();
    if (isFinishing()){
        overridePendingTransition(R.anim.activity_slide_in, R.anim.activity_slide_out);
    }

}
Pablo A. Martínez
quelle
Warum ist das besser?
Manuel
20
finish();
overridePendingTransition(0, 0);
Felipe
quelle
19

Ich habe dieses Problem mit diesem Ansatz behoben:

mit Animation öffnen:

 Intent newUser = new Intent(getBaseContext(), NewUserActivity.class);
    startActivity(newUser);
    overridePendingTransition(R.anim.slide_in_right,R.anim.slide_out_left);

So schließen Sie mit der Animation:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    onBackPressed();
    return super.onOptionsItemSelected(item);
}

@Override
public void onBackPressed() {
    super.onBackPressed();
    overridePendingTransition(R.anim.slide_out_right,R.anim.slide_in_right);
}
Deivison Sporteman
quelle
12

Schauen Sie sich das anhand eines Themas an. Sie können Enter-Exit-Animationen für Aktivitäten oder die gesamte Anwendung definieren

Nathan Schwermann
quelle
JA! Das war's. Na irgendwie. Ich hatte bereits ein Thema angewendet und für das Thema wurde eine Animation definiert. Deshalb konnte ich meine eigene Animation nicht zum Laufen bringen. Vielen Dank für den Einblick!
b-ryce
3
Können Sie mir einen Hinweis geben, wo ich nachsehen soll, welche Übergänge von den Themen geliefert werden? Ich möchte auch einen benutzerdefinierten Übergang für alle Websites festlegen, aber ich weiß nicht wie.
LuckyMalaka
@Zapnologica Diese andere Antwort, die ich für eine ähnliche Frage gegeben habe, beschreibt es ein bisschen mehr. stackoverflow.com/questions/4940574/…
Nathan Schwermann
6

Nach der Antwort von @schwiz finden Sie hier eine Animationsüberschreibung für das integrierte Dialog-Thema, in dem ich lokale slide_up- und slide_down-Animationen definiert habe. Meine Aktivität gibt das Thema MyDialog an, damit diese Übergänge ein- und ausgehen.

<style name="Animation.MyDialog" parent="android:Animation.Dialog">
    <item name="android:windowEnterAnimation">@anim/slide_up</item>
    <item name="android:windowExitAnimation">@anim/slide_down</item>
</style>

<style name="Theme.MyDialog" parent="android:Theme.Dialog">
    <item name="android:windowAnimationStyle">@style/Animation.MyDialog</item>
</style>

larham1
quelle
5

Verwenden Sie startActivityForResult, um Ihre untergeordnete Aktivität und in onActivityResult () Ihrer übergeordneten Aktivität zu starten:

    @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if(requestCode==REQUEST_YOUR_ACTIVITY) {
        overridePendingTransition(R.anim.parent_appearing_anim, R.anim.child_dissmissing_anim);
    }
    super.onActivityResult(requestCode, resultCode, arg2);
}
Chris.Zou
quelle
Dies funktioniert beim Zurückdrücken (physische Taste). Weitere Informationen finden Sie in der folgenden Antwort: /programming/20161234/onactivityresult-is-not-called-when-the-back-button-in-actionbar-is- geklickt / 20161352 # 20161352
lenooh
Wichtig zu beachten: overridePendingTransition muss aufgerufen werden, bevor super.onActivityResult aufgerufen wird. Andernfalls wird der Pendint-Übergang nicht überschrieben!
goemic