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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当使用dialog来实现loading框时,每次dialog弹出时手机的状态栏会变成其他颜色,这会影响用户的感官体验。为了解决这个问题,你可以使用以下方法: 1. 首先,设置透明蒙层来解决状态栏变色的问题。你可以使用以下代码: ```java Window dialogWindow = mDialog.getWindow(); dialogWindow.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); dialogWindow.setBackgroundDrawableResource(android.R.color.transparent); WindowManager.LayoutParams lp = dialogWindow.getAttributes(); lp.dimAmount = 0.0f; dialogWindow.setAttributes(lp); ``` 2. 然后,当dialog初始化时调用`dialogWindow.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND)`方法,这样dialog弹出时,状态栏的颜色将和Activity展示的状态栏保持一致,不会随着dialog弹出和销毁而改变。 然而,这种方法会引发另一个问题,就是当设置了透明背景后,状态栏的字体也会变成白色。如果Activity标题背景是白色的话,会造成冲突。为了解决这个问题,你可以尝试以下方法: 1. 在dialog弹出之前,将状态栏字体颜色设置为黑色。你可以使用以下代码: ```java dialogWindow.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); ``` 2. 在dialog关闭后,将状态栏字体颜色恢复为白色。你可以使用以下代码: ```java dialogWindow.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE); ``` 这样就可以解决android dialogfragment弹出时状态栏变色的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值