Retornar para DialogFragment de outra Activity reutiliza minha animação enter

Dec 06 2020

Eu tenho uma Activity (A) que cria um DialogFragment. Nesse DialogFragment, tenho um botão que cria uma nova Activity (B). Quando termino a Atividade B, ele exibe o DialogFragment da Atividade A e reutiliza a animação personalizada que defini. Como evito que meu DialogFragment reutilize essa animação ao retornar à Atividade A?

Esta resposta funciona para alguns dispositivos, no entanto, congela a janela inteira em alguns (daí a versão de verificação)

@Override
public void onStop() {
    super.onStop();
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.P) {
        getDialog().getWindow().setWindowAnimations(-1);
    }
}

https://stackoverflow.com/a/64454784/11110509

É assim que estou criando minha animação personalizada de entrar / sair do DialogFragment:

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {        
    final Dialog dialog = super.onCreateDialog(savedInstanceState);
    dialog.getWindow().getAttributes().windowAnimations = R.style.FragmentDialogAnim;
    return dialog;
}
<style name="FragmentDialogAnim">
    <item name="android:windowEnterAnimation">@anim/loginactivity_left_to_right</item>
    <item name="android:windowExitAnimation">@anim/loginactivity_right_to_left</item>
</style>

loginactivity_left_to_right:

<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false">
    <translate android:fromXDelta="-100%" android:toXDelta="0%"
        android:fromYDelta="0%" android:toYDelta="0%"
        android:duration="700"/>
</set>

loginactivity_right_to_left:

<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false">
    <translate
        android:fromXDelta="0%" android:toXDelta="-100%"
        android:fromYDelta="0%" android:toYDelta="0%"
        android:duration="700" />
</set>

Este é o código para criar o DialogFragment:

https://pastebin.com/k1c6nz3p

Respostas

2 MariosP Dec 14 2020 at 17:26

Você deve desabilitar a animação no método onPause () do seu DialogFragment em vez do método onStop () . Basta remover todas as linhas de código que você tem atualmente no método onStop () e adicionar onPause () com as linhas de código abaixo:

@Override
public void onPause() {
  super.onPause();
  if(getDialog()!=null)
    getDialog().getWindow().setWindowAnimations(-1);
 }

Fazendo isso no método onPause (), você desativa todas as animações de janela sem também congelar nenhum evento de toque.

IvanGarza Dec 13 2020 at 14:03

Reciclar visualizações sempre pode ser problemático, especialmente se você pretende que sejam ligeiramente diferentes em cada cenário.

Eu recomendaria que você parasse de reciclar esta caixa de diálogo e, em vez disso, criasse uma caixa de diálogo específica para cada um dos seus diferentes casos , ou que simplesmente passasse um sinalizador em sua caixa de diálogo definindo o que / quando usar as animações.