Ответ 1
возможно, вы можете сделать эту работу в методе onBackPressed() в активности.
@Override
public void onBackPressed() {
super.onBackPressed();
overridePendingTransition(R.anim.comming_in, R.anim.comming_out);
}
В моей деятельности у меня есть кнопка со следующим слушателем кликов, который отлично работает:
final ImageButton startOverButton = (ImageButton) findViewById(R.id.start_over_button);
startOverButton.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(final View v) {
finish();//go back to the previous Activity
overridePendingTransition(R.anim.comming_in, R.anim.comming_out);
}
});
Он оживляет возврат к предыдущему действию так, как я хочу. Однако, когда пользователь нажимает кнопку "Назад по умолчанию Android", анимация не запускается. Мой вопрос: где я должен поместить код анимации overridePendingTransition (R.anim.comming_in, R.anim.comming_out); так что эта анимация будет срабатывать как при нажатии пользователем на мою кнопку, так и на кнопку по умолчанию Android назад?
Как наивная попытка, я попытался установить overridePendingTransition (R.anim.comming_in, R.anim.comming_out); строка кода в методе onDestroy(), но это не сработало.
Заранее благодарю вас!
возможно, вы можете сделать эту работу в методе onBackPressed() в активности.
@Override
public void onBackPressed() {
super.onBackPressed();
overridePendingTransition(R.anim.comming_in, R.anim.comming_out);
}
В основном переопределение onBackPressed - это правильный подход, но вместо этого он должен отвечать на вызов super.onBackPressed(), а затем добавлять overridePendingTransition, чтобы мы немного соответствовали правилам наследования.
@Override
public void onBackPressed() {
super.onBackPressed();
overridePendingTransition(R.anim.comming_in, R.anim.comming_out);
}
если вы используете фрагмент, вы можете выполнить следующее:
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.setCustomAnimations(R.anim.anim_slide_in_left, R.anim.anim_slide_out_left, R.anim.anim_slide_out_right, R.anim.anim_slide_in_right);
transaction.replace(R.id.fragment_container, new YourClassFragment);
transaction.addToBackStack(null);
transaction.commit();
anim_slide_in_left
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<translate
android:duration="500"
android:interpolator="@android:interpolator/decelerate_quint"
android:fromXDelta="100%p"
android:toXDelta="0%p" >
</translate>
</set>
anim_slide_out_left
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<translate
android:duration="500"
android:interpolator="@android:interpolator/decelerate_quint"
android:fromXDelta="0%p"
android:toXDelta="-100%p" >
</translate>
</set>
anim_slide_out_right
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<translate
android:duration="@android:integer/config_mediumAnimTime"
android:interpolator="@android:interpolator/decelerate_quint"
android:fromXDelta="-100%p"
android:toXDelta="0%p" >
</translate>
</set>
anim_slide_in_right
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<translate
android:duration="@android:integer/config_mediumAnimTime"
android:interpolator="@android:interpolator/decelerate_quint"
android:fromXDelta="0%p"
android:toXDelta="100%p" >
</translate>
</set>
Несмотря на то, что переопределение onBackPressed()
является хорошим вариантом, я бы предложил переопределить метод finish()
, на всякий случай, если действие закончено каким-то другим способом, например, действие навигации или любое другое действие вида, которое "уничтожает" активность:
@Override public void finish() {
super.finish();
overridePendingTransition(0,0);
}
Нам нужно иметь в виду, что этот метод будет запущен после нажатия кнопки "Назад", поэтому мы будем рады: -)
Обновить. Более того, переопределение onBackPressed()
может испортить работу, если мы используем в нем фрагменты, потому что мы, вероятно, не хотим переопределять переходы каждый раз, когда нажата задняя часть.