android fragment 跳出,记录一下自己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报错的解释都忽略了,其实是一种问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DialogFragment dismiss后再显示,可能会出现闪烁的情况,这可能是因为在某些情况下,Activity被销毁并重新创建后,DialogFragment的状态没有正确地保存和恢复导致的。 其中一个可能的原因是,当Activity重建时,DialogFragment的实例会被重新创建,并且在Activity的生命周期方法中重新显示。这可能导致在旧的DialogFragment实例被销毁之前,新的实例已经被创建并显示。因此,会出现闪烁的问题。 为了解决这个问题,可以考虑使用setRetainInstance(true)方法来保留DialogFragment的实例,使其在Activity重新创建时能够正确地恢复。这样,新的DialogFragment实例不会被创建,而是继续使用旧的实例,并保持正确的状态。 此外,还可以在Activity的onSaveInstanceState()方法中保存DialogFragment的状态,并在onCreate()方法中进行恢复。这样可以确保DialogFragment的状态在Activity重新创建时能够正确地保存和恢复。 综上所述,为了解决DialogFragment dismiss后再显示时可能出现的闪烁问题,可以考虑使用setRetainInstance(true)方法保留DialogFragment的实例,并在Activity的生命周期方法中正确地保存和恢复其状态。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Android应用中使用Fragment组件的一些问题及解决方案总结](https://download.csdn.net/download/weixin_38677046/14882890)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [记录一下自己DialogFragment弹出来dismiss立刻弹出问题](https://blog.csdn.net/weixin_34249113/article/details/117602496)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值