记录一下自己DialogFragment弹出来dismiss后立刻又弹出的问题

         app需要几个弹窗功能,而且界面需要自定义,我看了网上一些关于DialogFragment的优点后决定使用dialogfragment。这里我有三个不同的弹窗,分别为开始、暂停和结束。使用过程中出现一个问题,就是每次我点击开始弹窗然后将开始弹窗dismiss后,弹窗会闪一下然后立刻浮现出来。而如果在一个加载弹窗结束后启动开始弹窗就不会有这个问题。暂停弹窗没有这个问题,结束弹窗也有这个问题,下面会解释一下出现问题的原因。

开始弹窗

经过很久的观察比对研究,排除了很多原因后,终于知道是我在Activity的onCreate里面加入了横屏语句,然后显示开始弹窗。横屏语句如下,在查询了横屏的生命周期后知道由竖屏切换到横屏,先是竖屏启动,onCreate里面的代码执行了一次,onCreate -->onStart-->onResume之后切换横屏,继续以下周期onPause -->onSaveInstanceState -->onStop -->onDestroy -->onCreate-->onStart -->onRestoreInstanceState-->onResume -->onPause -->onStop -->onDestroy,实际上并不会因为我横屏语句写在onCreate里面,横屏语句后面的代码就不执行了,执行完竖屏的onCreate后会再次执行横屏的onCreate,自己也验证过了。这就导致创建了两个开始弹窗,所以需要关闭两次。而为什么在一个加载弹窗结束后启动开始弹窗就不会有这个问题呢?那是因为在加载弹窗结束后显示开始弹窗,则开始弹窗只创建了一次。

/**

* 设置为横屏

*/

    if(getRequestedOrientation()!=ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE){

    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

//显示开始弹窗

    showStartDialog();

}

解决办法

在MainFest文件的此activity中加入android:configChanges="keyboardHidden|orientation|screenSize这句话即可,这句话会让activity横竖屏切换时不再执行生命周期。

结束弹窗

结束弹窗不是在onCreate中创建却还是会闪回弹出,后发现是同样的原因,即创建了两次。因为我在一个自定义控件的onDraw里面写了一个判断条件进行回调,执行代码如下:

```

onDraw(Canvas canvas){

if(fallObjects.get(fallObjects.size() -1).getIsOver()){

callBackListener.OnClickButton();

    score =0;

    Log.e("END", "onDraw: + end" );

}else if(drawing){

// 隔一段时间重绘一次

    getHandler().postDelayed(runnable, intervalTime);

}

}

```

而此回调不知为何也会执行两次,导致弹出了两次结束弹窗。

后面加一个变量进行控制,只记录第一次返回即可。

之所以这个问题想了好久,是因为打断点也看不出问题,而且是没有报错的,导致后来我在网上查找原因的时候把很多dialogfragment报错的解释都忽略了,其实是一种问题。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容