Como alternar atividade sem animação no Android?

165

Como posso usar corretamente o sinalizador Intent FLAG_ACTIVITY_NO_ANIMATIONno arquivo AndroidManifest? Suponho que meu problema seja trivial, mas não consigo encontrar um bom exemplo ou solução para ele.

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

No entanto, nenhum erro é relatado pelo compliador, mas datanão está correto. Eu só quero desativar a animação no caso de alternar entre atividades. Posso usar getWindow().setWindowAnimations(0);onCreate ou onResume, mas usar flag é a melhor maneira, não é?

Também posso usar no código:

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

Mas quero usar esse sinalizador no Android Manifest. Para desativar a animação também no caso de retornar da segunda atividade para a primeira.

woyaru
fonte
Encontrei a sugestão de usar o tema - definindo enter, exit animações para atividades ou aplicativo inteiro. Alguém pode me dar mais informações sobre isso?
Woyaru 7/08

Respostas:

269

Você pode criar um estilo,

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

e defina-o como tema para sua atividade no manifesto:

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

Você também pode definir um estilo para especificar animações personalizadas de entrada e saída. http://developer.android.com/reference/android/R.attr.html#windowEnterAnimation

Santosh
fonte
Obrigado, isso funciona muito bem, especialmente para atividades com temas transparentes / de diálogo excluídas de recentes com uma afinidade de tarefa diferente. Sem isso, a animação continuava mostrando resultados muito estranhos para a abertura de uma caixa de diálogo!
3c71 5/05
isso não parece mais funcionar para o Lollipop / Android 5.0?
Kenyee 23/03
Eu tenho o Android 5 e funciona para mim. O estilo do meu aplicativo fica assim: <style name = "AppTheme" parent = "Theme.AppCompat.Light.DarkActionBar"> <item name = "android: windowAnimationStyle"> @ null </item> </style>
eatyourgreens
Funciona perfeitamente no 6.0 também. Uma ótima dica. Como pergunto abaixo, eu me pergunto como desativar a animação que acontece quando * inicia um aplicativo pela primeira vez ... existe uma maneira ?!
Fattie
5
falhará se você estender o AppCompatActivity
Mike6679 27/03
191

Se o seu contexto for uma atividade, você poderá chamar overridePendingTransition :

Ligue imediatamente após um dos tipos de startActivity (Intent) ou finalize para especificar uma animação de transição explícita para executar a seguir.

Então, programaticamente:

this.startActivity(new Intent(v.getContext(), newactivity.class));
this.overridePendingTransition(0, 0);
eshirazi
fonte
é possível fazer isso via adb também?
desenvolvedor android
O @TalAngel overridePendingTransitionfoi adicionado no nível 5 da API. Portanto, não, ele não funciona em todas as versões do Android, mas acho que você direciona para um nível API mais alto do que o 5.
Bruno Bieri 04/02
43

Experimente este código,

this.startActivity(new Intent(v.getContext(), newactivity.class).addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION));
Bartłomiej Jończy
fonte
1
Isso realmente ajuda ao iniciar a atividade do serviço.
DearDhruv
24

Você também pode fazer isso em todas as atividades das quais não deseja fazer a transição:

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

Eu gosto dessa abordagem porque você não precisa mexer no estilo de sua atividade.


fonte
Uma ótima dica. Gostaria de saber como desativar a animação que acontece quando * iniciar um aplicativo pela primeira vez ... existe uma maneira ?!
Fattie
@Fattie Substitua o método onStart () da sua atividade de inicialização e coloque o mesmo código nela.
Jawad Adil 08/04
4

Aqui está uma solução de uma linha que funciona para o valor mais baixo minSdkVersion 14que você deve inserir em você res/styles.xml:

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

igual a:

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

Felicidades!

user1506104
fonte
3

A linha no estilo do tema funciona bem, mas substitui a animação por uma tela branca. Especialmente em um telefone mais lento - é realmente irritante. Portanto, se você deseja uma transição instantânea - você pode usar isso no estilo do tema:

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

crie seu próprio estilo substituindo o android: Theme

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

Em seguida, use-o em manifesto como este:

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

Após iniciar a intenção, você pode usar este código:

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

Se usado, a intenção funcionará sem animações ou transições

Faran
fonte