Come posso aggiungere un'animazione all'attività finish ()


98

Sto usando overridePendingTransition per quando la mia attività viene creata e funziona bene, posso vedere la dissolvenza in entrata funziona alla grande, ma quando provo ad animare la fine dell'attività sta ancora eseguendo la diapositiva predefinita da destra a sinistra.

Ho provato per la prima volta a definire l'animazione in uscita quando ho iniziato l'attività come segue:

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

Poi ho provato a farlo anche quando ho finito l'attività

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

Ma nessuno di questi approcci impedirà la diapositiva "da destra a sinistra" per l'animazione di uscita. Qualche idea su cosa sto sbagliando?

Risposte:


228

Ignoro la transizione in sospeso subito dopo aver chiamato finish ();

Nel mio caso, l'ho fatto per evitare transizioni.

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

L'ordine è importante :)


5
da "Dettagli", @Goofyahead sta nominando la sua Attività che lo racchiude - ymmv. Questa tecnica ha funzionato per me per sostituire un'animazione da Theme.Dialog su 2.x, ma non 3.x o 4.x
larham1

8
Come ti R.anim.nothingsembra?
sandalone

Usa la risposta di @Felipe Micaroni Lalli, 0 significa nessuna animazione.
Yeung

Anche questo mi ha aiutato. Spiega come definire le proprie animazioni: stackoverflow.com/questions/5151591/…
Adam

23
È possibile ignorare il finish()metodo per evitare le transizioni in tutti i casi (pulsante Indietro premuto, come esempio): @Override public void finish() { super.finish(); overridePendingTransition(0, 0); }
eugeneek

29

Questa domanda ha già risposto, ma il modo più efficiente per inserire un'animazione mentre si esce da un'attività è sovrascrivere il metodo "finish ()" dell'attività correlata:

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

24

Suggerirei di utilizzare il metodo isFinishing () per configurare le animazioni su onPause invece di chiamare finish ()

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

}

Perché è meglio?
Manuel


19

Ho risolto questo problema utilizzando questo tipo di approccio:

da aprire con animazione:

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

Per chiudere con l'animazione:

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

12

Cerca di farlo attraverso un tema. È possibile definire animazioni di entrata e uscita per le attività o l'intera applicazione


SÌ! Questo è tutto. Beh, un po '. Avevo già applicato un tema e il tema aveva un'animazione definita, quindi è per questo che non sono riuscito a far funzionare la mia animazione. Grazie mille per l'intuizione!
b-ryce

3
puoi darmi un suggerimento su dove guardare quali transizioni saranno fornite dai temi. Vorrei anche impostare una transizione personalizzata per tutti i siti ma non so come.
LuckyMalaka

@Zapnologica quest'altra risposta che ho dato per una domanda simile lo spiega un po 'di più. stackoverflow.com/questions/4940574/...
Nathan Schwermann

6

Seguendo la risposta di @schwiz, ecco una sostituzione dell'animazione per il tema di dialogo integrato, in cui ho definito le animazioni slide_up e slide_down locali. La mia attività specifica il tema MyDialog in modo da avere queste transizioni dentro e fuori.

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


5

Usa startActivityForResult per avviare l'attività del tuo bambino e in onActivityResult () dell'attività del tuo genitore:

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

Funziona alla pressione posteriore (pulsante fisico). Per farlo funzionare anche con la freccia "su", leggi questa risposta: /programming/20161234/onactivityresult-is-not-called-when-the-back-button-in-actionbar-is- cliccato / 20161352 # 20161352
lenooh

Importante da notare: overridePendingTransition deve essere chiamato prima di chiamare super.onActivityResult. Altrimenti la transizione pendint non sarà sovrascritta!
goemic
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.