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