wake-up-neo.com

Android - So animieren Sie einen Aktivitätsübergang, wenn die Standard-Zurück-Taste gedrückt wird

In meiner Aktivität habe ich eine Schaltfläche mit dem folgenden Klicklistener, die hervorragend funktioniert:

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

Es animiert die Rückkehr zur vorherigen Aktivität auf die von mir gewünschte Weise. Wenn der Benutzer jedoch die Standard-Zurück-Taste Android) drückt, wird die Animation nicht ausgelöst. Meine Frage lautet: Wo soll ich den Animationscode einfügen? overridePendingTransition (R.anim.comming_in, R.anim.comming_out); damit diese Animation sowohl beim Anklicken meines Buttons als auch im Default Android Zurück Button?

Als naiven Versuch habe ich versucht, die overridePendingTransition (R.anim.comming_in, R.anim.comming_out); Codezeile in die onDestroy () - Methode einzufügen, aber Es hat nicht funktioniert.

Danke im Voraus!

40
Tiago

möglicherweise können Sie diese Arbeit in der Methode onBackPressed () in der Aktivität ausführen.

@Override
public void onBackPressed() {
    super.onBackPressed();
    overridePendingTransition(R.anim.comming_in, R.anim.comming_out);   
}
105
TaoZang

Grundsätzlich ist das Überschreiben von onBackPressed ein angemessener Ansatz, aber anstatt finish () aufzurufen, würde ich sagen, dass es besser ist, super.onBackPressed () aufzurufen und dann overridePendingTransition hinzuzufügen, damit wir ein bisschen konsistenter mit den Vererbungsregeln sind.

@Override
public void onBackPressed() {
    super.onBackPressed();
    overridePendingTransition(R.anim.comming_in, R.anim.comming_out);   
}
15
Caye

Auch wenn das Überschreiben von onBackPressed() eine gute Option ist, würde ich vorschlagen, die finish() -Methode zu überschreiben, nur für den Fall, dass die Aktivität auf eine andere Weise beendet wird, beispielsweise durch eine Navigationsaktion oder eine andere Ansichtsaktion das "zerstört" die Aktivität:

@Override public void finish() {
   super.finish();
   overridePendingTransition(0,0);
}

Wir müssen berücksichtigen, dass diese Methode ausgelöst wird, nachdem der Zurück-Button gedrückt wurde, also können wir loslegen :-)

pdate: Darüber hinaus könnte das Überschreiben von onBackPressed() die Aktivität durcheinander bringen, wenn Fragmente verwendet werden, da wir die Übergänge wahrscheinlich nicht bei jedem Zurücksetzen überschreiben möchten gedrückt.

4
cesards

wenn Sie ein Fragment verwenden, können Sie wie folgt vorgehen:

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