Как отключить анимацию перехода диалогового фрагмента при возобновлении работы приложения?

#android #kotlin #android-animation #android-dialogfragment

#Android #kotlin #android-анимация #android-dialogfragment

Вопрос:

У меня есть следующая логика, которая устанавливает пользовательскую анимацию для моего диалогового фрагмента, чтобы он скользил по правому экрану в Kotlin.

 dialog?.window?.attributes?.windowAnimations = R.style.dialog_style
  

Все замечательно, но когда я перехожу на главный экран своего мобильного телефона и эффективно помещаю свое приложение в фоновый режим, а затем, когда я возвращаю его обратно, я вижу, что анимация также активируется.

Есть ли способ временно отключать анимацию всякий раз, когда я повторно открываю приложение в фоновом режиме, а затем восстанавливать анимацию при загрузке диалогового фрагмента.

На мой взгляд, странно видеть переход диалогового фрагмента при повторном открытии приложения, он выглядит лучше, когда нет анимации (стиль по умолчанию)

Я хочу, чтобы пользовательская анимация применялась только при переходе между фрагментами в моем приложении, но без анимации, когда фрагмент возобновляется из фонового состояния (приостановлен?).

Ответ №1:

Я использовал savedInstanceState , чтобы проверить, открывается ли приложение повторно, и установить windowEnterAnimation значение null. Вот мое решение.

Сначала создайте два стиля.

 <style name="Animation.MyApp.CustomDialogFragment">
    <item name="android:windowEnterAnimation">@anim/slide_in</item>
    <item name="android:windowExitAnimation">@anim/slide_out</item>
</style>

<style name="Animation.MyApp.CustomDialogFragment.Restore">
    <item name="android:windowEnterAnimation">@null</item>
</style>
  

Затем переопределите onCreateDialog() из DialogFragment.

 open class CustomDialogFragment : DialogFragment() {

    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        val dialog = super.onCreateDialog(savedInstanceState)

        if (savedInstanceState == null) {
            dialog.window?.setWindowAnimations(
                R.style.Animation_MyApp_CustomDialogFragment
            )
        } else {
            dialog.window?.setWindowAnimations(
                R.style.Animation_MyApp_CustomDialogFragment_Restore
            )
        }

        return dialog
    }
}
  

Комментарии:

1. У меня не сработало в onCreateDialog, потому что оно не вызывается после того, как приложение ненадолго запустилось. В итоге я сохранил логический индикатор, если фрагмент диалога достигает onStop, а затем в OnStart, если логическое значение равно true, я установил новый стиль с анимацией null, и он отлично работает.

2. @ItayFeldman зачем сохранять логическое значение, когда при вызове onStop также будет вызван OnStart? Это отключит анимацию выхода для пользователя, чего я не хочу.

Ответ №2:

  1. Создайте свои стили
 <style name="Animation.App.FlushMessage" parent="@android:style/Animation.Activity">
        <item name="android:windowEnterAnimation">@anim/anim_flush_message_in</item>
        <item name="android:windowExitAnimation">@anim/anim_flush_message_out</item>
    </style>

    <style name="Animation.App.FlushMessage.Exit" parent="@android:style/Animation.Activity">
        <item name="android:windowEnterAnimation">@null</item>
        <item name="android:windowExitAnimation">@anim/anim_flush_message_out</item>
    </style>
  
  1. Переопределить OnStart:
 class YourDialogFragment: DialogFragment() {

  var setupAnim = false

  override fun onStart() {
    super.onStart()
    
    if (setupAnim) {
        requireDialog().window?.setWindowAnimations(R.style.Animation_App_FlushMessage_Exit)
    } else {
        setupAnim = true
        requireDialog().window?.setWindowAnimations(R.style.Animation_App_FlushMessage)
    }
  }

}
  

Комментарии:

1. ты делаешь мой день. Ты гений.