Активация выхода активности не работает должным образом на Android 4.0
У меня есть тема, которая изменяет анимацию открытия/закрытия/входа/выхода активности:
<style name="down_up_theme" parent="Theme.rtlfr">
<item name="android:windowAnimationStyle">@style/down_up_animation</item>
</style>
<style name="down_up_animation" parent="@android:style/Animation.Activity">
<item name="android:activityOpenEnterAnimation">@anim/slide_in_top</item>
<item name="android:activityOpenExitAnimation">@anim/hold</item>
<item name="android:activityCloseEnterAnimation">@anim/hold</item>
<item name="android:activityCloseExitAnimation">@anim/slide_out_bottom</item>
</style>
И в манифесте:
<activity android:name=".activity.ArticlesActivity"
android:theme="@style/down_up_theme" />
Цель состоит в том, чтобы сделать снимок активности вниз при запуске и продвигаться вверх при выходе.
Анимация отлично работает на 2.3. В 4.0, однако, анимация выхода (слайд вверх) не работает. То, что он делает, является закрытием действий, которые порождаются этой деятельностью. В моем случае я хочу оживить закрытие операции со списком статей, вместо этого закрытие детали статьи имеет слайд-анимацию.
Я думаю, я мог бы попытаться добавить закрывающую анимацию к активности, которая порождает ту, которую я хочу оживить, но на самом деле порождает действия, которые должны иметь разные анимации. Я также не мог найти никакой информации об этой версии 2.3 против 4.0 в документации .
Как заставить анимацию работать с 4.0?
Ответы
Ответ 1
Я не уверен, почему анимация выхода, установленная в теме, не работает на ICS +, но вызов overridePendingTransition()
, похоже, работает. Самый простой способ сделать это для вас - это, вероятно, переопределить finish()
в вашей деятельности:
@Override
public void finish() {
super.finish();
overridePendingTransition(R.anim.hold, R.anim.slide_out_bottom);
}
Ответ 2
Я хотел бы добавить немного лишнего ответа на этот ответ; решение переопределить анимацию отлично работает, но вы, вероятно, не хотите жестко кодировать анимацию. Было бы неплохо получить их из манифеста, как и для других версий платформы.. так что...
добавьте пару своих полей в свою активность, чтобы удерживать идентификаторы анимаций, связанных с вашей деятельностью.
protected int activityCloseEnterAnimation;
protected int activityCloseExitAnimation;
и где-то в вашем onCreate...
// Retrieve the animations set in the theme applied to this activity in the
// manifest..
TypedArray activityStyle = getTheme().obtainStyledAttributes(new int[] {android.R.attr.windowAnimationStyle});
int windowAnimationStyleResId = activityStyle.getResourceId(0, 0);
activityStyle.recycle();
// Now retrieve the resource ids of the actual animations used in the animation style pointed to by
// the window animation resource id.
activityStyle = getTheme().obtainStyledAttributes(windowAnimationStyleResId, new int[] {android.R.attr.activityCloseEnterAnimation, android.R.attr.activityCloseExitAnimation});
activityCloseEnterAnimation = activityStyle.getResourceId(0, 0);
activityCloseExitAnimation = activityStyle.getResourceId(1, 0);
activityStyle.recycle();
тогда, где ваша деятельность завершается/должна применяться анимация,...
overridePendingTransition(activityCloseEnterAnimation, activityCloseExitAnimation);
и ваши действия должны правильно оценивать анимации, которые вы задали в теме/стиле, связанные с действиями в вашем манифесте.
Ответ 3
Я тоже был смущен этой проблемой. Но, к счастью, вскоре я нашел ответ. Вы должны проверить свой файл анимации, является ли его корневой элемент "Set" или нет. Если это не так, вы должны обернуть его элементом "Set", а атрибут ActivityCloseAnimation будет работать нормально.
Я попробовал. Надеюсь, это поможет вам.
Ответ 4
вы смотрите здесь используйте overridePendingTransition и windowEnterAnimation/windowExitAnimation shoud работают для вас