web-dev-qa-db-fra.com

Android - Comment animer une transition d'activité lorsque le bouton de retour par défaut est enfoncé

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!

40
Tiago

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);   
}
105
TaoZang

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);   
}
15
Caye

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é.

4
cesards

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>
2
amine