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

本文讲述了作者在使用DialogFragment实现不同弹窗功能时遇到的问题,特别是当在Activity的onCreate中设置横屏并触发开始弹窗时,弹窗会重复出现。通过深入理解生命周期和横屏配置变化,作者揭示了问题的根源并提供了解决方案,即在Manifest文件中加入特定配置以防止活动重置生命周期。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值