动画上解雇的对话片段(Animate a dialog fragment on dismiss)

2019-09-16 23:32发布

我试图让一个dialogfragment关闭时的动画 - 我试图改写为下面的解雇,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);
    }
}

Answer 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



Answer 2:

您可以通过调用类及其超级访问外部类,其中听众坐在简单。 像这样的: 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) {}
    });
}   


文章来源: Animate a dialog fragment on dismiss