我正试图在关闭时获得动画的对话片段 - 我试图覆盖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);
}
}
答案 0 :(得分:1)
我刚用常规对话框子类做了这个,我的解决方案应该完全转移到DialogFragment
。
看起来你非常接近,只是你应该在onAnimationEnd()而不是super.dismiss()
中调用dismiss()
。原因是如果你调用dismiss()
,它将递归调用你已经在的函数!
编辑:
在外部类中定义包装器方法或使用YourDialogFragment.super()调用它。
void parentDismiss() { super.dismiss() }
并从您的onAnimationEnd()
拨打该电话。
即便如此,当你取消对话时,你还会遇到一个与竞争条件有关的问题,并且被另一个线程解雇了。要解决这个问题,请在第一次调用onDismiss()时设置一个布尔值mIsDismissed
,这样如果在另一个onStart()
发生之前再次调用它(你将覆盖onStart()以反转布尔值) onDismiss()
的身体没有被执行两次。
我在这里编写了一个解决方案,它不使用DialogFragment
,只是一个常规的Dialog。它经过测试和工作,所以只需查看我使用的逻辑并进行复制,或者如果您愿意,可以使用它。
答案 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) {}
});
}