Подтвердить что ты не робот

Активация выхода активности не работает должным образом на 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?

4b9b3361

Ответ 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 работают для вас