Comment changer d'activité sans animation sous Android?

165

Comment puis-je utiliser correctement l'indicateur d'intention FLAG_ACTIVITY_NO_ANIMATIONdans le fichier AndroidManifest? Je suppose que mon problème est trivial, mais je ne trouve pas de bon exemple ni de solution.

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

Cependant, aucune erreur n'est signalée par le compliateur, mais datan'est pas correcte. Je veux juste désactiver l'animation en cas de basculement entre les activités. Je peux utiliser getWindow().setWindowAnimations(0);dans onCreate ou onResume plutôt mais utiliser flag est une meilleure façon, n'est-ce pas?

Je peux aussi utiliser dans le code:

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

Mais je souhaite utiliser cet indicateur dans le manifeste Android. Pour désactiver l'animation également en cas de retour de la deuxième activité à la première.

woyaru
la source
J'ai trouvé la suggestion d'utiliser le thème - en définissant des animations d'entrée et de sortie pour les activités ou l'application entière. Quelqu'un peut-il me donner plus d'informations à ce sujet?
woyaru

Réponses:

269

Vous pouvez créer un style,

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

et définissez-le comme thème de votre activité dans le manifeste:

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

Vous pouvez également définir un style pour spécifier des animations d'entrée et de sortie personnalisées. http://developer.android.com/reference/android/R.attr.html#windowEnterAnimation

Santosh
la source
Merci, cela fonctionne très bien, en particulier pour les activités à thème transparent / dialogue exclues des récents avec une affinité de tâche différente. Sans cela, l'animation a continué à montrer, créant des résultats très étranges pour un dialogue ouvert!
3c71
cela ne semble plus fonctionner pour Lollipop / Android 5.0?
kenyee
J'ai Android 5 et cela fonctionne pour moi. Le style de mon application ressemble à ceci: <style name = "AppTheme" parent = "Theme.AppCompat.Light.DarkActionBar"> <item name = "android: windowAnimationStyle"> @ null </item> </style>
eatyourgreens
Fonctionne parfaitement dans la version 6.0 également. Un bon conseil. Comme je le demande ci-dessous, je me demande comment désactiver l'animation qui se produit lorsque * le premier lancement d'une application ... y a-t-il un moyen?!
Fattie
5
plantera si vous étendez AppCompatActivity
Mike6679
191

Si votre contexte est une activité, vous pouvez appeler overridePendingTransition :

Appelez immédiatement après l'une des versions de startActivity (Intent) ou finish pour spécifier une animation de transition explicite à exécuter ensuite.

Donc, par programmation:

this.startActivity(new Intent(v.getContext(), newactivity.class));
this.overridePendingTransition(0, 0);
eshirazi
la source
est-il possible de le faire via adb aussi?
développeur android
@TalAngel a overridePendingTransitionété ajouté au niveau de l'API 5. Donc non, cela ne fonctionne pas sur "toutes" les versions d'Android mais je suppose que vous ciblez un niveau d'API plus élevé que 5.
Bruno Bieri
43

Essayez ce code,

this.startActivity(new Intent(v.getContext(), newactivity.class).addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION));
Bartłomiej Jończy
la source
1
Cela aide vraiment lors du démarrage de l'activité à partir du service.
DearDhruv
24

Vous pouvez également le faire dans toutes les activités dont vous ne souhaitez pas effectuer la transition:

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

J'aime cette approche car vous n'avez pas à vous soucier du style de votre activité.


la source
Un bon conseil. Je me demande comment désactiver l'animation qui se produit lors du * premier lancement d'une application ... y a-t-il un moyen?!
Fattie
@Fattie Remplacez la méthode onStart () de votre activité de lancement et placez-y le même code.
Jawad Adil
4

Voici une solution one-liner qui fonctionne aussi bas que celle minSdkVersion 14que vous devriez insérer en vous res/styles.xml:

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

ainsi:

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

À votre santé!

user1506104
la source
3

La ligne dans le style de thème fonctionne bien, mais cela remplace l'animation par un écran blanc. Surtout sur un téléphone plus lent - c'est vraiment ennuyeux. Donc, si vous voulez une transition instantanée, vous pouvez l'utiliser dans le style de thème:

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

créez votre propre style en remplaçant Android: Thème

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

Ensuite, utilisez-le dans le manifeste comme ceci:

<activity android:name=".MainActivity"
    android:theme="@style/noAnimationStyle">
</activity>
goyo
la source
0

Après avoir démarré l'intention, vous pouvez utiliser ce code:

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

S'il est utilisé, l'intention fonctionnera sans animations ni transitions

Faran
la source