在关闭时为对话框片段设置动画

时间:2012-05-02 07:34:26

标签: android animation

我正试图在关闭时获得动画的对话片段 - 我试图覆盖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);
    }
}

2 个答案:

答案 0 :(得分:1)

我刚用常规对话框子类做了这个,我的解决方案应该完全转移到DialogFragment

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

编辑:

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

void parentDismiss() { super.dismiss() }

并从您的onAnimationEnd()拨打该电话。

即便如此,当你取消对话时,你还会遇到一个与竞争条件有关的问题,并且被另一个线程解雇了。要解决这个问题,请在第一次调用onDismiss()时设置一个布尔值mIsDismissed,这样如果在另一个onStart()发生之前再次调用它(你将覆盖onStart()以反转布尔值) onDismiss()的身体没有被执行两次。

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

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

答案 1 :(得分: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) {}
    });
}