trocar fragmento em uma atividade por meio de animação

94

Quero trocar dois fragmentos em uma atividade por meio de animação. Suponha que a Página A seja para o fragmento A e o lado esquerdo da tela e a Página B para o fragmento B, ou seja, do lado direito da tela. Agora eu quero que, quando clicar em um botão na página A, a página A se mova para o lado direito da tela com alguma animação de transição.

Tentei o código abaixo para substituir a posição

FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.container, new FragB());
fragmentTransaction.commit();

Procurando alguma pista.

Desde já, obrigado.

Deepak Goel
fonte
1
possível duplicata do Animate a transição entre fragmentos
TalkLittle

Respostas:

282

Pergunta antiga e provavelmente você já descobriu, mas para referência futura:

aqui está o que você usa para definir uma animação personalizada ao substituir um fragmento por meio de código:

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();

ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right);
ft.replace(R.id.fragment_container, newFragment, "fragment");
// Start the animated transition.
ft.commit();

Aqui está um exemplo da animação slide_in_left:

<?xml version="1.0" encoding="utf-8"?>
<set>
  <translate xmlns:android="http://schemas.android.com/apk/res/android"
   android:fromXDelta="-100%"
   android:toXDelta="0"
   android:interpolator="@android:anim/decelerate_interpolator"
   android:duration="500"/>
</set>

Observe que esta é a animação se você estiver usando a biblioteca de compatibilidade. Em vez disso, se você estiver usando um SDK com suporte nativo para o FragmentManager, sua animação terá a seguinte aparência:

<?xml version="1.0" encoding="utf-8"?>
<set>
  <objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:propertyName="x" 
    android:valueType="floatType"
    android:valueFrom="-1280"
    android:valueTo="0" 
    android:duration="500"/>
</set>

Isso ocorre porque a biblioteca de compatibilidade não oferece suporte ao novo tipo de objectAnimator e, em vez disso, implementa apenas a estrutura de animação antiga.

Sciutand
fonte
92
Esta é definitivamente a resposta certa. Observe que a ordem é importante! Você precisa ter a chamada setCustomAnimations () antes das chamadas de adição / substituição!
theelfismike de
2
Então, qual abordagem você deve usar se quiser o melhor comp?
K - A toxicidade em SO está crescendo.
17
Essas diferentes animações não são exatamente iguais. Você está assumindo que a largura do seu fragmento é igual a 1280 usando um valor de -1280. Se a largura for maior, ele não começará completamente fora da tela.
egfconnor
51
Você pode usar as animações predefinidas do namespace do Android: transaction.setCustomAnimations (android.R.anim.slide_in_left, android.R.anim.slide_out_right);
Jordy
2
As animações predefinidas acionam uma exceção de tempo de execução, FWIW, porque contam com a tag "traduzir".