Bootstrap

Android DialogFragment弹出动画的一点小坑

DialogFragment我相信还是有不少人去使用,但是有一种场景用的人不一定很多。

    就是假设基于MainActivity从下往上滑出一个DialogFragment,在我们与DialogFragment交互去另一个(假设是OtherActivity)界面的时候,此时从OtherActivity返回到MainActivity,会再执行一次滑出DialogFragment的行为,这显然不是我们想要的交互。

    第一反应就是看源码,找来找去终于找到了,原来在DialogFragment的onStart和onStop中,分别调用了dialog.show 和dialog.dismiss方法,这就是根源所在。

    

@Override
    public void onStart() {
        super.onStart();

        if (mDialog != null) {
            mViewDestroyed = false;
            mDialog.show();
        }
    }

    找到了源码,那么就想修改方法,第一个就是想到了如果是返回的时候onStart弹出之前修改DialogFrgament的Style,让它不再是滑动出现。试了试发现还是不行,再看源码。

@NonNull
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        return new Dialog(getActivity(), getTheme());
    }

    原来这个Theme只有在创建dialog被用到一次,后面即使修改也不会再被用到,所以这个方法不行。

    

    既然如此,那该怎么办呢。这里我是使用Dialog风格的Activity来实现的,

<style name="AnimationActivity" parent="@android:style/Animation.Activity">
        <item name="android:activityOpenEnterAnimation">@anim/slide_in_from_bottom</item>
        <item name="android:activityOpenExitAnimation">@null</item>
        <item name="android:activityCloseEnterAnimation">@null</item>
        <item name="android:activityCloseExitAnimation">@anim/slide_out_to_bottom</item>
    </style>

    返回界面以及从Dialog进入别的界面都不执行任何动画。

    最近测试发现消失的时候不执行这个动画,而且不同rom消失方式不同,比如华为是右出,锤子是直接消失,发现activityCloseExitAnimation似乎没起作用,因此重写finish()方法,再补充一个设置。

    

 @Override
    public void finish() {
        super.finish();
        overridePendingTransition(R.anim.slide_in_from_bottom,R.anim.slide_out_to_bottom);
    }

;