【问题标题】:Animate a dialog fragment on dismiss在关闭时为对话框片段设置动画
【发布时间】:2016-02-03 08:02:00
【问题描述】:

我正在尝试让对话框片段在关闭时进行动画处理 - 我试图覆盖如下的关闭、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 解雇()。你最近看电影开场了吗?)

标签: android animation


【解决方案1】:

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

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

编辑:

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

void parentDismiss() { super.dismiss() }

然后通过您的onAnimationEnd() 拨打电话。

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

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

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

【讨论】:

  • 我认为您仍然可以在匿名类中调用 YourDialogFragment.super。
  • @HelinWang 是的,这绝对是正确的。我很久以前写过这个。谢谢指正。
【解决方案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) {}
    });
}   

【讨论】:

    猜你喜欢
    • 2014-10-21
    • 1970-01-01
    • 2017-08-09
    • 2018-03-04
    • 1970-01-01
    • 1970-01-01
    • 2013-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多