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报错的解释都忽略了,其实是一种问题。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐