При возврате к DialogFragment из другого действия моя анимация ввода повторно используется
У меня есть Activity (A), который создает DialogFragment. В этом DialogFragment у меня есть кнопка, которая создает новое действие (B). Когда я заканчиваю действие B, он отображает DialogFragment из действия A и повторно использует заданную мной настраиваемую анимацию. Как предотвратить повторное использование этой анимации DialogFragment при возврате к действию A?
Этот ответ работает для некоторых устройств, однако на некоторых он замораживает все окно (отсюда и контрольная версия)
@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
Вот как я создаю свою собственную анимацию входа / выхода 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>
Вот код для создания DialogFragment:
https://pastebin.com/k1c6nz3p
Ответы
Вы должны отключить анимацию в методе onPause () вашего DialogFragment вместо метода onStop () . Просто удалите все строки кода, которые у вас есть в методе onStop (), и добавьте onPause () со следующими строками кода:
@Override
public void onPause() {
super.onPause();
if(getDialog()!=null)
getDialog().getWindow().setWindowAnimations(-1);
}
Делая это в методе onPause (), вы отключаете всю анимацию окна, не останавливая при этом какие-либо события касания.
Повторное использование представлений всегда может быть проблематичным, особенно если вы хотите, чтобы он немного отличался в каждом сценарии.
Я бы рекомендовал либо прекратить повторное использование этого диалога и вместо этого создать конкретный диалог для каждого из ваших различных случаев , либо просто передать флаг в свой диалог, определяющий, что и когда использовать анимацию.