4

我试图让一个对话框片段在关闭时进行动画处理 - 我试图覆盖如下的关闭、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);
    }
}
4

2 回答 2

1

我只是用一个常规的对话子类做到了这一点,我的解决方案应该准确地转移到DialogFragment

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

编辑:

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

void parentDismiss() { super.dismiss() }

并从您的onAnimationEnd().

即使那样,当您取消对话框并且它被另一个线程解除时,您仍然会遇到竞争条件的另一个问题。要解决这个问题,mIsDismissed请在第一次调用 onDismiss() 时设置一个布尔值,这样如果在另一个onStart()发生之前再次调用它(您将覆盖 onStart() 以将布尔值翻转回来),则onDismiss()' 的主体不会执行两次。

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

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

于 2012-05-04T02:45:13.760 回答
1

您可以通过调用类的超类来访问侦听器所在的外部类。像这样: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) {}
    });
}   
于 2016-02-02T23:42:39.567 回答