关闭一个对话框片段时如何添加动画效果

4

我正在尝试在关闭时使DialogFragment动画化 - 我已经尝试覆盖以下dismiss,onDismiss,onCancel和onDestroy方法,但没有成功 - 有人可以指点我正确的方向吗?

@Override
public void dismiss() {
    if (mDismissAnimationFinished) {
        super.dismiss();
    } else {

        mShrink.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {
            }

            @Override
            public void onAnimationEnd(Animation animation) {
                mDismissAnimationFinished = true;
                dismiss();
            }

            @Override
            public void onAnimationRepeat(Animation animation) {

            }
        });
        mCurrentContainer.startAnimation(mShrink);
    }
}

这个问题是那些dimiss/cancel函数根本没有被调用还是动画没有运行? 同时在onAnimationEnd中,您正在重新调用dismiss()。 您最近看了电影《盗梦空间》吗? - MikeIsrael
2个回答

1

您可以通过使用super关键字来访问监听器所在的外部类。像这样:Classname.super.method()

public void dismiss() {

    yourAnimation.setAnimationListener(new Animation.AnimationListener() {
        @Override
        public void onAnimationStart(Animation animation) {}

        @Override
        public void onAnimationEnd(Animation animation) {
            classNameOfYourDialog.super.dismiss();
        }

        @Override
        public void onAnimationRepeat(Animation animation) {}
    });
}   

1

我刚刚使用了一个常规的对话框子类,我的解决方案应该可以完全转移到DialogFragment上。

看起来你已经非常接近了,只是你应该在onAnimationEnd()中调用super.dismiss()而不是dismiss()。原因是如果你调用dismiss(),它会递归调用你已经在其中的函数!

编辑:

在外部类中定义一个包装方法或者使用YourDialogFragment.super()进行调用。

void parentDismiss() { super.dismiss() }

然后从您的onAnimationEnd()中调用它。

即使如此,当您取消对话框并且它正在被另一个线程解除时,您仍将面临另一个竞态条件问题。为了解决这个问题,在第一次调用您的onDismiss()时设置一个布尔值mIsDismissed,以便如果在另一个onStart()发生之前再次调用它(您将覆盖onStart()以将布尔值翻转回来),那么onDismiss()的主体不会执行两次。

我在这里编写了一个解决方案,它不使用DialogFragment,只是一个常规对话框。它经过测试并且可以正常工作,所以只需查看我使用的逻辑并复制它,或者如果您愿意,可以使用它。

https://github.com/tom-dignan/nifty/blob/master/src/com/tomdignan/nifty/dialogs/NiftyProgressDialog.java


1
我认为你仍然可以在匿名类中调用YourDialogFragment.super。 - Helin Wang
@HelinWang 是的,那绝对正确。我写这个已经很久了。感谢您的纠正。 - Thomas Dignan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接