¿Cómo cambiar la actividad sin animación en Android?

165

¿Cómo puedo usar correctamente el indicador de intención FLAG_ACTIVITY_NO_ANIMATIONen el archivo AndroidManifest? Supongo que mi problema es trivial, pero no puedo encontrar un buen ejemplo o solución.

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

Sin embargo, el compilador no informa de ningún error, pero datano es correcto. Solo quiero deshabilitar la animación en caso de que cambie entre actividades. Puedo usar getWindow().setWindowAnimations(0);en onCreate o onResume, pero usar flag es la mejor manera, ¿no?

Puedo usar también en código:

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

Pero quiero usar esta bandera en el Manifiesto de Android. Para deshabilitar la animación también en caso de regresar de la segunda actividad a la primera.

woyaru
fuente
He encontrado la sugestión para usar el tema, definiendo las animaciones enter, exit para actividades o la aplicación completa. ¿Alguien puede darme más información al respecto?
woyaru

Respuestas:

269

Puedes crear un estilo,

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

y configúrelo como tema para su actividad en el manifiesto:

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

También puede definir un estilo para especificar animaciones de entrada y salida personalizadas. http://developer.android.com/reference/android/R.attr.html#windowEnterAnimation

Santosh
fuente
Gracias, esto funciona muy bien, especialmente para actividades temáticas transparentes / de diálogo excluidas de recientes con una afinidad de tarea diferente. Sin esto, la animación seguía mostrando la creación de resultados muy extraños para abrir un diálogo.
3c71
¿Esto ya no parece funcionar para Lollipop / Android 5.0?
kenyee
Tengo Android 5 y funciona para mí. El estilo de mi aplicación se ve así: <style name = "AppTheme" parent = "Theme.AppCompat.Light.DarkActionBar"> <item name = "android: windowAnimationStyle"> @ null </item> </style>
eatyourgreens
Funciona perfectamente en 6.0 también. Un gran consejo. Como pregunto a continuación, me pregunto cómo deshabilitar la animación que ocurre cuando * inicia una aplicación por primera vez ... ¿hay alguna manera?
Fattie
55
se bloqueará si extiende AppCompatActivity
Mike6679
191

Si su contexto es una actividad, puede llamar a overridePendingTransition :

Llame inmediatamente después de uno de los sabores de startActivity (Intent) o termine para especificar una animación de transición explícita para realizar a continuación.

Entonces, programáticamente:

this.startActivity(new Intent(v.getContext(), newactivity.class));
this.overridePendingTransition(0, 0);
eshirazi
fuente
¿es posible hacerlo también a través de adb?
Desarrollador de Android
@TalAngel the overridePendingTransitionfue agregado en el nivel 5 de API. Entonces no, no funciona en "todas" las versiones de Android, pero supongo que apuntas a un nivel API más alto que 5.
Bruno Bieri
43

Prueba este código,

this.startActivity(new Intent(v.getContext(), newactivity.class).addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION));
Bartłomiej Jończy
fuente
1
Esto realmente ayuda al comenzar la actividad desde el servicio.
DearDhruv
24

También puede hacer esto en todas las actividades de las que no desea realizar la transición:

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

Me gusta este enfoque porque no tiene que meterse con el estilo de su actividad.


fuente
Un gran consejo. Me pregunto cómo deshabilitar la animación que ocurre cuando * inicia una aplicación por primera vez ... ¿hay alguna manera?
Fattie
@Fattie Anule el método onStart () de su actividad de lanzamiento y coloque el mismo código en eso.
Jawad Adil
4

Aquí hay una solución de una sola línea que funciona tan bajo como la minSdkVersion 14que debe insertar en usted res/styles.xml:

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

al igual que:

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

¡Salud!

usuario1506104
fuente
3

La línea en el estilo del tema funciona bien, pero eso reemplaza la animación con una pantalla en blanco. Especialmente en un teléfono más lento, es realmente molesto. Entonces, si desea una transición instantánea, puede usar esto en el estilo del tema:

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

crea tu propio estilo anulando Android: Tema

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

Luego úsalo en manifiesto de esta manera:

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

Después de comenzar la intención, puede usar este código:

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

Si se usa, la intención funcionará sin animaciones ni transiciones.

Faran
fuente