Android 在点击外部时向DialogFragment的关闭添加动画

Android 在点击外部时向DialogFragment的关闭添加动画,android,android-dialogfragment,Android,Android Dialogfragment,我是Android开发新手(来自Swift/iOS)。当我点击视图外部时,我试图在关闭对话框片段时添加一些动画。我已经阅读了很多关于对话动画的帖子,并找到了一些帮助我的解决方案走到这一步的帖子 工作原理: 在警报中可以很好地放大和淡出(启动时onStart()正在工作) 当按下“关闭”按钮时,警报会很好地缩小并淡出 点击(点击onClick()正在工作) 什么不起作用: 在警报之外点击。它关闭警报,但不显示优美的动画 从技术上讲,这是为了: DialogFragment 使用AlertD

我是Android开发新手(来自Swift/iOS)。当我点击视图外部时,我试图在关闭对话框片段时添加一些动画。我已经阅读了很多关于对话动画的帖子,并找到了一些帮助我的解决方案走到这一步的帖子

工作原理:

  • 在警报中可以很好地放大和淡出(启动时
    onStart()
    正在工作)
  • 当按下“关闭”按钮时,警报会很好地缩小并淡出 点击(点击
    onClick()
    正在工作)
什么不起作用:

  • 在警报之外点击。它关闭警报,但不显示优美的动画
从技术上讲,这是为了:

  • DialogFragment
  • 使用
    AlertDialog.Builder
  • 可取消的
    属性在生成器上设置为true
  • 在所创建的
    警报对话框
    上,将
    设置取消对外部接触
    属性设置为true
  • 对我的动画使用
    ObjectAnimator
  • 为了满足客户要求,我需要支持关闭按钮和“点击外部”来取消/关闭对话框
  • 从我的发现来看,取消发生在onDismiss之前
  • 问题:

    我很高兴能在对话框中添加一个
    OnCancelListener
    。然而,在运行时我收到一个错误,基本上是

    注意:DialogFragment拥有Dialog.setOnCancelListener和Dialog.setOnDismissListener回调。你不能自己设置它们。要了解这些事件,请重写onCancel(DialogInterface)和onDismiss(DialogInterface)

    嗯。很简单,我想我会覆盖
    OnCancel

    是的,但当我点击警报对话框片段外部时,动画确实会出现。它仍然取消(关闭)-只是没有动画。调试时,我看到它进入了我的代码中,但一旦我输入重写的
    onCancel()
    方法,警报就已经关闭/隐藏/取消。看来我在生命周期中已经太晚了。由于我无法为
    对话框片段
    覆盖
    OnCancelListener
    ,我想知道是否有人能解决或洞察我的困境

    长与短: 我希望能够有相同的动画,我有点击对话框的关闭按钮,因为我做时,点击外面的警报

    以下是我的代码片段:

    public void onStart() {
        super.onStart();
    
        AlertDialog dialog = (AlertDialog)getDialog();
        ObjectAnimator scaleUp = scaleUp(dialog);
        scaleUp.start();
    
        Button closeButton = dialog.getButton(Dialog.BUTTON_NEGATIVE);
        closeButton.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                AlertDialog dialog = (AlertDialog)getDialog();
                ObjectAnimator scaleDown = scaleDown(dialog);
                scaleDown.addListener(new Animator.AnimatorListener() {
                    @Override
                    public void onAnimationEnd(Animator animation) {
                        dismiss();
                    }
                    @Override
                    public void onAnimationStart(Animator animation) {
                    }
                    @Override
                    public void onAnimationCancel(Animator animation) {
                    }
                    @Override
                    public void onAnimationRepeat(Animator animation) {
                    }
                });
                scaleDown.start();
            }
        });
    }
    
    以下是onCancel覆盖:

        @Override
    public void onCancel(final DialogInterface dialog) {
    
        ObjectAnimator scaleDown = scaleDown((AlertDialog)dialog);
        scaleDown.addListener(new Animator.AnimatorListener() {
            @Override
            public void onAnimationEnd(Animator animation) {
                Log.i("DialogFragment","onAnimationEnd");
                dialog.dismiss();
            }
    
            @Override
            public void onAnimationStart(Animator animation) {
                Log.i("DialogFragment","onAnimationStart");
            }
            @Override
            public void onAnimationCancel(Animator animation) {
            }
            @Override
            public void onAnimationRepeat(Animator animation) {
            }
                              });
        scaleDown.start();
    
    
    }
    
    这两种方法
    scaleUp
    scaleDown
    只是重构的,它们只是
    ObjectAnimator
    的设置

    后续行动: 我的解决方案的灵感来源于标记为“可能重复”的解决方案,然而,这并没有解决我所概述的具体情况——在对话框外点击动画


    我在该链接中使用的解决方案是,当点击对话框内的按钮时,非常接近动画,但不处理
    设置取消到外部(true)

    可能与我添加的后续内容重复的内容。这是我用来帮助我形成解决方案的主要链接之一,但在警报对话框外部点击(setCanceledOnTouchOut(true))并不能解决我的问题