Dans mon activité, j'ai un bouton avec l'écouteur de clics suivant qui fonctionne très bien:
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);
}
});
Il anime le retour à l'activité précédente comme je le souhaite. Cependant, lorsque l'utilisateur appuie sur le bouton Android retour par défaut, l'animation n'est pas déclenchée. Ma question est: où dois-je mettre le code d'animation overridePendingTransition (R.anim.comming_in, R.anim.comming_out); pour que cette animation soit déclenchée à la fois lorsque l'utilisateur clique sur mon bouton et dans le bouton par défaut Android retour?
Comme un essai naïf, j'ai essayé de mettre la overridePendingTransition (R.anim.comming_in, R.anim.comming_out); ligne de code dans la méthode onDestroy () mais cela n'a pas fonctionné.
Merci d'avance!
vous pouvez peut-être faire ce travail dans la méthode onBackPressed () de l'activité.
@Override
public void onBackPressed() {
super.onBackPressed();
overridePendingTransition(R.anim.comming_in, R.anim.comming_out);
}
Fondamentalement, remplacer onBackPressed est une approche appropriée, mais plutôt que d'appeler finish (), je dirais qu'il vaut mieux appeler super.onBackPressed () puis ajouter overridePendingTransition afin que nous soyons un peu plus cohérents avec les règles d'héritage.
@Override
public void onBackPressed() {
super.onBackPressed();
overridePendingTransition(R.anim.comming_in, R.anim.comming_out);
}
Même si remplacer onBackPressed()
est une bonne option, je suggérerais de remplacer la méthode finish()
, juste au cas où l'activité se terminerait d'une autre manière, comme une action de navigation ou toute autre action d'affichage qui "détruit" l'activité:
@Override public void finish() {
super.finish();
overridePendingTransition(0,0);
}
Nous devons avoir en considération que cette méthode sera déclenchée après avoir appuyé sur le bouton Retour, nous sommes donc prêts à partir :-)
pdate: De plus, la surcharge de onBackPressed()
pourrait perturber l'activité si nous utilisons des fragments, car nous ne voulons probablement pas remplacer les transitions à chaque fois que le dos est pressé.
si vous utilisez un fragment, vous pouvez procéder comme ceci:
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>