在外部点击时添加动画以关闭DialogFragment

时间:2017-05-04 16:49:42

标签: android android-dialogfragment

我是Android开发的新手(来自Swift / iOS)。当我在视图外面点击时,我正在尝试为DialogFragment的关闭添加一些动画。我已经阅读了各种关于Dialogs动画的帖子,并找到了有助于我的解决方案的这些帖子。

什么有效:

  • 很好地扩展并在警报中消失(onStart()正在运行)
  • 当"关闭"很好地缩小并淡出警报。按钮是 点击(onClick()正在运行)

什么行不通:

  • 在警报之外敲击。它会在没有优雅动画的情况下关闭警报。

从技术上讲,这是为了:

  1. DialogFragment
  2. 使用AlertDialog.Builder
  3. 构建器
  4. 上的cancelable属性设置为true
  5. 在创建的setCanceledOnTouchOutside上将AlertDialog属性设置为true。
  6. 使用ObjectAnimator制作动画
  7. 为了符合客户要求,我需要同时支持关闭按钮和"在外面点击"取消/取消对话框。
  8. 我的发现onCancel发生在onDismiss
  9. 之前

    的问题:

    我很高兴在我的对话框中添加OnCancelListener。但是,在运行时我收到一个错误,基本上是陈述

      

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

    确定。很容易,我想我会覆盖OnCancel

    我做了,但是当我在警告对话框片段之外点击时,动画确实发生了。它仍然取消(关闭) - 只是没有动画。调试,我看到它进入我的代码,但是一旦我输入被覆盖的onCancel()方法,警报就已经关闭/隐藏/取消。好像我在生命周期中为时已晚。由于我无法覆盖OnCancelListener的{​​{1}},我想知道是否有人有解决方案或洞察我的困境。

    长短: 我希望能够使用相同的动画来点击对话框的关闭按钮,就像在警报外点击一样。

    这是我的代码段:

    DialogFragments

    这是onCancel覆盖:

    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();
            }
        });
    }
    

    两种方法 @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的设置。

    跟进: 我的解决方案的灵感来自标记为可能重复的一个。 Change DialogFragment enter/exit transition at just before dismissing,但这并没有解决我所概述的具体情况 - 在对话框外点击时的动画。

    当我点击对话框内的按钮时,我从该链接使用的解决方案非常接近动画,但不处理ObjectAnimator

0 个答案:

没有答案