#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:
- Создайте свои стили
<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>
- Переопределить 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. ты делаешь мой день. Ты гений.