web-dev-qa-db-ja.com

Android-デフォルトの戻るボタンが押されたときにアクティビティの遷移をアニメーション化する方法

私の活動では、次のクリックリスナーを備えたボタンがあります。

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()メソッドに入れようとしましたが、うまく行かなかった。

前もって感謝します!

40
Tiago

アクティビティのonBackPressed()メソッドでこの作業を行うことができます。

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

基本的にonBackPressedをオーバーライドすることは適切なアプローチですが、それからfinish()を呼び出すよりも、super.onBackPressed()を呼び出してoverridePendingTransitionを追加することをお勧めします。これにより、継承ルールともう少し一貫性が保たれます。

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

onBackPressed()をオーバーライドするのは良いオプションですが、アクティビティがナビゲーションアクションや他のビューアクションなど他の方法で終了した場合に備えて、finish()メソッドをオーバーライドすることをお勧めしますアクティビティを「破壊」します。

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

戻るボタンが押された後にこのメソッドがトリガーされることを考慮する必要がありますので、行ってください:-)

更新:さらに、onBackPressed()をオーバーライドすると、その中にフラグメントを使用している場合、アクティビティが台無しになる可能性があります。押された。

4
cesards

フラグメントを使用する場合、次のように進めることができます。

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