Come cambiare attività senza animazione in Android?


165

Come posso usare correttamente il flag Intent FLAG_ACTIVITY_NO_ANIMATIONnel file AndroidManifest? Suppongo che il mio problema sia banale, ma non riesco a trovare un buon esempio o soluzione ad esso.

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

Tuttavia, nessun errore viene segnalato dal compliator, ma datanon è corretto. Voglio solo disabilitare l'animazione nel caso in cui passi da un'attività all'altra. Posso usare getWindow().setWindowAnimations(0);piuttosto in onCreate o onResume ma usare flag è il modo migliore, no?

Posso usare anche nel codice:

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

Ma voglio usare questo flag in Android Manifest. Per disabilitare l'animazione anche nel caso in cui si ritorni dalla seconda attività alla prima.


Ho trovato il suggerimento di utilizzare il tema - definendo animazioni di invio, uscita per attività o intera applicazione. Qualcuno può darmi maggiori informazioni a riguardo?
Woyaru,

Risposte:


269

Puoi creare uno stile,

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

e impostalo come tema per la tua attività nel manifest:

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

Puoi anche definire uno stile per specificare animazioni di entrata e uscita personalizzate. http://developer.android.com/reference/android/R.attr.html#windowEnterAnimation


Grazie, questo funziona alla grande soprattutto per le attività a tema di dialogo trasparente escluse da recenti con una diversa affinità di attività. Senza questo, l'animazione continua a mostrare risultati molto strani per l'apertura di una finestra di dialogo!
3c71

questo sembra non funzionare più per Lollipop / Android 5.0?
Kenyee,

Ho Android 5 e funziona per me. Lo stile della mia app è simile al seguente: <style name = "AppTheme" parent = "Theme.AppCompat.Light.DarkActionBar"> <item name = "android: windowAnimationStyle"> @ null </item> </style>
eatyourgreens

Funziona perfettamente anche con 6.0. Un ottimo consiglio. Come chiedo di seguito, mi chiedo come disabilitare l'animazione che si verifica al primo avvio di un'app ... c'è un modo ?!
Fattie,

5
andrà in crash se estendi AppCompatActivity
Mike6679,

191

Se il tuo contesto è un'attività, puoi chiamare overridePendingTransition :

Chiama subito dopo uno dei tipi di startActivity (Intent) o finish per specificare un'animazione di transizione esplicita da eseguire successivamente.

Quindi, a livello di codice:

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

è possibile farlo anche tramite adb?
sviluppatore Android

@TalAngel the è overridePendingTransitionstato aggiunto nel livello API 5. Quindi no, non funziona su "ogni" versione di Android, ma immagino che tu abbia come target un livello API superiore a 5.
Bruno Bieri

43

Prova questo codice,

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

1
Questo aiuta davvero quando si avvia l'attività dal servizio.
DearDhruv,

24

Puoi anche farlo in tutte le attività da cui non desideri passare:

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

Mi piace questo approccio perché non devi fare confusione con lo stile della tua attività.


Un ottimo consiglio. Mi chiedo come disabilitare l'animazione che si verifica al primo avvio di un'app ... c'è un modo ?!
Fattie,

@Fattie Ignora il metodo onStart () dell'attività di avvio e inserisci lo stesso codice in quello.
Jawad Adil,


4

Ecco una soluzione one-liner che funziona per il minimo minSdkVersion 14che dovresti inserire in te res/styles.xml:

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

così:

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

Saluti!


3

La linea nello stile del tema funziona bene, ma sostituisce l'animazione con uno schermo bianco. Soprattutto su un telefono più lento - è davvero fastidioso. Quindi, se vuoi una transizione istantanea, puoi usarla nello stile del tema:

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

2

crea il tuo stile Android dominante: Tema

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

Quindi usalo in manifest in questo modo:

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

0

Dopo aver avviato l'intento è possibile utilizzare questo codice:

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

Se utilizzato, l'intento funzionerà senza animazioni o transizioni

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.