Android onAnimationEnd()调用了两次

Android onAnimationEnd()调用了两次,android,android-support-library,android-8.1-oreo,Android,Android Support Library,Android 8.1 Oreo,在从23更新构建sdk 27之后,在调用下面的代码时遇到了onAnimationEnd两次触发的问题。onAnimationStart只调用一次,onAnimationRepeat未按预期调用。现在,在应用程序中,当用户按下后退按钮一次时,他们会后退两步 gradle中的所有库都使用最新的27.0.2。这段代码在sdk 23中可以正常工作。我们的最低目标是16 我正在通过使用isAnimating标志来解决问题,但希望找到可能影响应用程序其他区域的根本原因 @Override public vo

在从23更新构建sdk 27之后,在调用下面的代码时遇到了onAnimationEnd两次触发的问题。onAnimationStart只调用一次,onAnimationRepeat未按预期调用。现在,在应用程序中,当用户按下后退按钮一次时,他们会后退两步

gradle中的所有库都使用最新的27.0.2。这段代码在sdk 23中可以正常工作。我们的最低目标是16

我正在通过使用isAnimating标志来解决问题,但希望找到可能影响应用程序其他区域的根本原因

@Override
public void onBackPressed() {
        Animation slideOutRightAnimation = AnimationUtils.loadAnimation(this, R.anim.slide_out_right);
        slideOutRightAnimation.setFillAfter(true);
        slideOutRightAnimation.setAnimationListener(new AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {
                isAnimating = true;
            }

            @Override
            public void onAnimationRepeat(Animation animation) {
            }

            @Override
            public void onAnimationEnd(Animation animation) {
                if(isAnimating) { // Fix
                    getSupportFragmentManager().popBackStackImmediate();
                }
                isAnimating = false;
            }
        });
        fragmentToPopView.clearAnimation();
        fragmentToPopView.startAnimation(slideOutRightAnimation);
请试一试

开始动画之前


片段TopopView.clearAnimation

删除onAnimationEnd上的旧侦听器将解决您的问题

        @Override
        public void onAnimationEnd(Animation animation) {
            slideOutRightAnimation.setAnimationListener(null);
            // ... //
        }

你能确保onBackPressed没有被调用两次吗?不是的,我试着在onBackPressed和onAnimationStart中设置断点。他们两个都只打过一次电话。还应该提到的是,这段代码在SDK 23中运行良好。在NimationEnd方法中添加Thread.dumpStack Inode时,您在这两种情况下都看到了什么?@pskink试图记录animation.toString的.d值?或者只是onAnimationEnd中的animation.hashCode?它们真的一样吗?你到底想要什么?当我调用startAnimation时,我希望AnimationEnd被调用一次。现在StartAnimation每次调用两次,你想在屏幕上从右向左滑动吗?