46

在我的活动中,我有一个带有以下点击监听器的按钮,效果很好:

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()方法中的代码行,但它不起作用。

先感谢您!

4

4 回答 4

112

也许您可以在活动中的 onBackPressed() 方法中完成这项工作。

@Override
public void onBackPressed() {
    super.onBackPressed();
    overridePendingTransition(R.anim.comming_in, R.anim.comming_out);   
}
于 2012-08-21T03:04:22.227 回答
17

基本上覆盖 onBackPressed 是一种正确的方法,但与其调用 finish() 我会说最好调用 super.onBackPressed() 然后添加 overridePendingTransition 这样我们就更符合继承规则。

@Override
public void onBackPressed() {
    super.onBackPressed();
    overridePendingTransition(R.anim.comming_in, R.anim.comming_out);   
}
于 2013-09-13T14:19:21.397 回答
8

尽管覆盖onBackPressed()是一个不错的选择,但我建议覆盖该finish()方法,以防活动以其他方式完成,例如导航操作或“破坏”活动的任何其他视图操作:

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

我们需要考虑到此方法将在按下后退按钮后触发,所以我们很高兴:-)

更新:此外,onBackPressed()如果我们在其中使用片段,覆盖可能会弄乱 Activity,因为我们可能不希望每次按下后都覆盖转换。

于 2017-05-01T19:31:35.680 回答
3

如果你使用片段,你可以这样进行:

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>
于 2016-08-19T23:02:01.293 回答