过哪些印象留下深刻印象 英文的坑(bug),后来又是怎么爬出来的

天天风之旅平地掉坑BUG是怎么回事?怎么解决? - QQ泡泡乐园
热门推荐: &
您当前的位置:&&& &
天天风之旅平地掉坑BUG是怎么回事?怎么解决?
&&发布者:Admin_PoPo &分类:&&发布时间:
天天风之旅平地掉坑BUG是怎么回事?怎么解决?
天天风之旅平地掉坑BUG是怎么回事?怎么解决?
天天风之旅掉坑BUG是什么?解决方法介绍。《天天风之旅》游戏不少的玩家都发现了掉坑bug,无缘无故的就掉地上来了。的玩家们,最常见的就是调到坑里面了。那么,遇到这类BUG要怎样处理呢?小编今天给大家带来的是天天风之旅掉坑BUG解决办法。
这是赤裸裸的&坑&阿!跑得好好的,无缘无故就变这样了,然后就掉下去扣体力了。其实这个问题已经存在很久了,官方那边总是说会解决,但是到现在为止这个问题还是一直困扰着大家。(这不是在打自己的脸嘛&&)
掉下去一次就算了,咱们还有希望能跑赢,但是一局你让我掉两次!还让不让人玩了?(如上图)掉下去一次也没事还能补回来,但是刚上来没多久又掉一次!这时候小编我也实在忍不住爆了一句粗口(泥煤阿!还能不能愉快的玩耍了?信不信我卸载!)但是生气归生气,解决的办法总是要想出来的,小编用过很多办法都不理想,如果小伙伴们怕碰到这样的BUG那么只能带&生命之炎&了,毕竟生命之炎的技能是掉坑免伤大量体力,当然这也不是长久之计,这几天经过广大玩家的吐槽,相信官方那边会在最短的时间内做出回应的。
事情是这样子的:差不多从12月中旬开始,在《天天风之旅》贴吧等玩家交流平台上,陆续有玩家表示&突然地会从平地上掉入深坑,然后再也上不来了&&&。作为一款跑酷游戏,玩家全情投入&奔跑&,却会无缘无故从平地上掉上去,而且仿佛是遇到无底洞一般,角色再也无法上来。这一定会他们觉得&太太太意外了&。笔者在官方论坛上看到,除了一些入门安卓机型,三星S4和搭载iOS8系统的苹果用户,也有反馈此问题。
从可能是最早的&BUG帖&的发布时间开始计算,到现在也过去了半个月。腾讯官方已宣布,将于明天(12月30日)对服务器进行8个小时的停机更新。看来,在&诡异掉坑&了至少半个月后,跑酷玩家总算不用再受此&雷人折磨&了。希望官方也可以对玩家做出应有的补偿,尤其是那些在钻石PK场中遭遇&平地掉坑BUG&的玩家。原著的那些BUG和坑……
看香港电影金像奖,知道了陈果要把《红VAN》拍成电影,很好奇这是怎样的小说能在香港红成这样子(红VAN在香港媒体经常被提及,还出书),于是把小说找来看了一遍。小说写得很吸引,作者挖坑(设置谜团)的技巧很厉害,会让人读了就停不下来。但越读就越担心,因为小说读到95%,作者依然在挖坑,我很担心作者会填不上来。果然,我担心的事情真的发生了。小说的最后一篇,其实就是作者写不下去了,于是扔给你写作提纲——你自己看吧。然而,就算最后扔出来那份提纲,依旧是千仓百孔漏洞百出,根本填不完之前挖的坑。看得出作者是一边写才一边想故事,到后边,他自己都忘了自己挖了什么坑了……另外,小说还有很多低级的错误,例如一个很明显的,小说里面的面具人装束是带防毒面具、穿西装的,而最后作者解释那个地方其实是满布辐射的……大家都应该知道要怎样的装束才能防辐射吧?要完全密封,就算只是露一条小缝隙,都防不了辐射。(还好这个装束在电影改了)再说电影。就因为小说都这么糟,我很好奇电影能拍出什么出来。电影莫名其妙的地方太多,让人哭笑不得,就不一一赘述。电影从毒男唱歌的时候就成了搞笑片,然后全片的调调就是搞笑+讽刺。到最后,李灿森保持住被刀砍进身体的姿势出场,我惊呆了。这是周星驰电影?电影垃圾得不值一提,而且我劝大家也不要看原著小说。因为挖了坑不填的小说,跟太监文一样性质,看完只想把作者揪出来质问——你骗我看了前面那么多字,最后这样就叫结局?你赔我时间啊……然后再提几个小说中也根本没填的坑,有剧透,介意的慎看——1.两个YUKI。电影也有说到,主人公第一晚像见鬼一样见到了另一个YUKI,但后来没解释是怎么一回事。2.一开始接到的神秘电话。这个电影里面也有。他们一开始就接到一个莫斯密码的major tom电话,但为什么会打这些电话给他们?小说最后也无解。3.毕业照片。有胎记的日本人说,主人公是他的同学,然后主人公回大埔的家居然在毕业照片中见到这个日本人同学。这是不可能的。因为,作者最后说,主人公其实也是日本人,而且成年之前都是在日本生活的,那么,跟那个胎记日本做同学,当然也是在日本的事情(Bug.1 那为啥毕业照片是香港的学校?那个日本人压根不会中文,别说他小时候在香港读书啊)。还有,主人公其实并不是“阿池”,只是被植入了一个香港人“阿池”的记忆,那么,Bug.2,为啥香港人“阿池”的家里会有跟胎记日本人一起毕业的照片?那根本不是日本人主人公的家啊,那群日本人也不可能把这照片带过去(因为那群日本人根本不能让他知道自己身份)。4.谁告诉阿信去大帽山玩扫雷?小说中,有“人”告诉阿信去到大帽山的那个什么中心,玩扫雷。但谁告诉阿信的?为什么告诉阿信?到最后都成谜!5.阿信回到香港,并与阿怡结婚。小说中,阿信在医院死了,但主人公马上接到了阿信打来的电话,阿信表示自己已经回到了香港,然后还要和主人公的女朋友阿怡结婚。阿信怎么回到香港的?没说!阿信为什么会认识阿怡?没说!6.涂鸦在红VAN座位的死亡数字。小说里,两个街童在座位涂鸦了一堆公仔,公仔是乘客的人数,而且在公仔的头上写了数字,恰好就是每个人距离死亡还有多少小时的准确数字。疑问1,既然他们都是受到辐射死的,哪里能准确预测死亡时间?疑问2,为什么两个街童能准确预言死亡时间?没解释~……反正就是一堆坑没填,作者自己都不能自圆其说。这样的烂小说也能出书、拍电影,香港的文化市场真是没文化……
这篇影评有剧透
两个yuki我感觉很好解释,这说明植入阿池的记忆开始混乱.
最开始yuki的性格是根据记忆产生的,...
两个yuki我感觉很好解释,这说明植入阿池的记忆开始混乱.
最开始yuki的性格是根据记忆产生的,然后制裁春代强奸犯的时候杀人犯yuki开始觉醒.因为补插很多刀,让阿池也看到了那个似鬼一样的yuki...
打神秘电话我认为是为了把分散的人群聚集起来,比较好监视.
公仔这个纯粹是一时兴起模仿阿婆的无人生还吧,还有那个一起制裁也是模仿东方快车谋杀案
两个yuki说明植入阿池的记忆开始混乱。这个可以说是,也可以不是。那一段路是第一次面具人出...
两个yuki说明植入阿池的记忆开始混乱。这个可以说是,也可以不是。那一段路是第一次面具人出现,那整段记忆都是假的?面具人可以当是假,毕竟只有一刹那。而Yuki是一起走了那么远的路。
或者换个角度,阿池的那段记忆是真的,混乱的是Yuki,Yuki自己忘记了跟阿池一起。但她住的地方……反正有可能种可能,作者并没有解释。(所以才说他挖坑不填……)
打神秘电话是为了把分散的人群聚集起来。这个观点大概也有这种可能。只是我试着设身处地想象下,假如没有神秘电话,他们到早上发现世界没有变化,还是会聚集在一起(毕竟全世界就只有这十来个人,当初互相留电话就是为了第二天联系)。所以神秘电话好像在“聚集人群”这方面并没有很实际的作用。
而且奇怪的是神秘电话的内容。内容是歌词,表达形式是摩斯密码,而且是奇怪声音的摩斯密码。在后面(包括小说当中)也的确没有解释为什么。。。。
公仔在里面的还是那两个疑问,1.为什么有准确的死亡时间,2.为什么潮童能画得出来。
毕业照片这个更好解释,其实就是他的即时感...因为他看的这些,与那个鬼yuki都只是他两段身份记...
毕业照片这个更好解释,其实就是他的即时感...因为他看的这些,与那个鬼yuki都只是他两段身份记忆发生冲突下的产物...他所见的是别人见不到的即时感
毕业照我觉得不能这样解释吧……如果在家里翻出毕业照仔细认人的行为都能用既视感解释,那整...
毕业照我觉得不能这样解释吧……如果在家里翻出毕业照仔细认人的行为都能用既视感解释,那整个故事都这样解释就完了,就一切都没意义。
大佬,1,2,3,6在小说中都有解释喔
大佬,1,2,3,6在小说中都有解释喔
1、 【因此,在?計劃?重覆途中,在其餘15個實驗體的不斷死亡及交替中,唯獨469891和...
1、 【因此,在?計劃?重覆途中,在其餘15個實驗體的不斷死亡及交替中,唯獨469891和有希子兩人不會病發,當結束一次實驗後,二人即被重設記憶,周而復始。
  而大概是香港境內所殘餘的輻射始終過高,影響人類腦部的?海馬體?運作,故作為?不變數?的469891和有希子兩人,常會經歷一些腦神經?短路?,錯誤看見/自以為感覺到上幾次實驗的親身記憶。】
4、【Major Tom的求生程式繼而將目標鎖定第一批離開小巴為數四人的實驗體,透過各種方法連繫上四人,告知其所掌握的情報(?蓋亞?傳送過來的?計劃藍圖?),並引導四人帶領其他「實驗體」前往大帽山信息總站,試圖以人手重新啟動「Major Tom」各項被停用的功能。 】
套用4的解释的话,2的电话可能majot tom给大家的求助,h-e-l-p,让大家帮助他reset。
这些年香港经济、文化不断走下坡路背景下,对大陆的恐惧与愤懑,体现在这么一部港人自虐的小...
这些年香港经济、文化不断走下坡路背景下,对大陆的恐惧与愤懑,体现在这么一部港人自虐的小说与电影里,框架很好,立意也不错,可惜故事没讲好
1、 【因此,在?計劃?重覆途中,在其餘15個實驗體的不斷死亡及交替中,唯獨469891和...
1、 【因此,在?計劃?重覆途中,在其餘15個實驗體的不斷死亡及交替中,唯獨469891和有希子兩人不會病發,當結束一次實驗後,二人即被重設記憶,周而復始。
  而大概是香港境內所殘餘的輻射始終過高,影響人類腦部的?海馬體?運作,故作為?不變數?的469891和有希子兩人,常會經歷一些腦神經?短路?,錯誤看見/自以為感覺到上幾次實驗的親身記憶。】
4、【Major Tom的求生程式繼而將目標鎖定第一批離開小巴為數四人的實驗體,透過各種方法連繫上四人,告知其所掌握的情報(?蓋亞?傳送過來的?計劃藍圖?),並引導四人帶領其他「實驗體」前往大帽山信息總站,試圖以人手重新啟動「Major Tom」各項被停用的功能。 】
套用4的解释的话,2的电话可能majot tom给大家的求助,h-e-l-p,让大家帮助他reset。
“反正就是一堆坑没填,作者自己都不能自圆其说。这样的烂小说也能出书、拍电影,香港的文化...
“反正就是一堆坑没填,作者自己都不能自圆其说。这样的烂小说也能出书、拍电影,香港的文化市场真是没文化……”
说得非常正确啊!刚刚看完电影,记得里面有段任达华说过的台词:“难怪别人都说我们香港人没文化。。”
电影我还是很喜欢的,但感觉也蛮多漏洞
小说。。。这粤语日常粗口夹文言夹普语的写作倒算是...
电影我还是很喜欢的,但感觉也蛮多漏洞
小说。。。这粤语日常粗口夹文言夹普语的写作倒算是见识了,正在看
多点宽容之心,我觉得立意很不错
并不是100%的无厘头闹剧讽刺啊,看到最后我都觉得很抓人
那份虚无感其实很不错
还有我十分喜欢david bowie haha
可能也可以这么解~
“錯誤看見/自以為感覺到上幾次實驗的親身記憶”我最讨厌这种神经病解...
可能也可以这么解~
“錯誤看見/自以為感覺到上幾次實驗的親身記憶”我最讨厌这种神经病解释,不论当中有任何不合理的灵异事件都能这样万能解。小说《姑获鸟之夏》也是这样,看到最后居然姐姐神经病、妹妹神经病,连主视觉的主人公也神经病,就这样解释了之前的各种不合理和悬疑……
不太同意对姑获鸟的观点,因为姑获鸟从一开始就不是走的普通本格推理路子,全书不断在铺垫这...
不太同意对姑获鸟的观点,因为姑获鸟从一开始就不是走的普通本格推理路子,全书不断在铺垫这种思维禁锢认知,记忆受到精神影响的基调,所以在书里那个小世界这个结果是合理的,不能用我们自己现实生活的情况去套。还有一点,主人公本身也是事件经历者,叙述是以他的角度,这也是所谓“诡计”成立的原因之一
& 2005-, all rights reserved 北京豆网科技有限公司BUG和谐了,不过又是一个坑的开始_天天来塔防吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0可签7级以上的吧50个
本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:13,300贴子:
BUG和谐了,不过又是一个坑的开始
是利用漏洞将对手的战力变为0,然后利用蛋疼的战力压制PK规则战胜对方。在这里对方的真实战力我们称它原始战力, 0战力称它为实时战力,天美为了弥补这次漏洞,在PK结束加入了条件限制当实战力为0是结算异常。然后关键来了。当一名玩家实时战力为0时,结算永远异常。如果我们主动将战力降为0,防守不就无敌了。可能会有人反驳我,一名玩家PK我,数据只能是在该名玩家游戏客户端和游戏本身之间进行,和我本身客户端数据没有关系。那我说一点,当一玩家pk第四名的同时,第四名pk第一名,均胜利,该玩家第几名大家都很清楚。所以游戏pk数据是在三名玩家手机客户端与游戏本身数据库之间进行的。只要你经常待在pk界面,不下线,你的实时战力妥妥的为0。所以大家坐等土豪放水吧,抢到名次你就赢了。。。别问我自己的战力如何变为0,前几天贴吧里有人发过。
随后会放制作过程
怪事年年有,今年特别多...
湖南卫视 江苏卫视 浙...
电影院有人中途离场,豆...
滴滴滴,2016年仅剩3天...
女星实在是弱的一逼,...
张天爱第一次担任大银幕...
一晃眼,又到了买过年火...
这是吐槽日报年终盘点系...
这一年以来我们这个世界...
爱美之心,人皆有之。 ...
看到的人都笑了!请准备...
3D双端东方魔幻网游「大青云」勾魂公测,穿越逆转,封神故事,全新演绎!
自己战力变0,谁发过?
在此奉劝各位大神,莫放水,放水被人坑。。
不知道咯。
楼主真有才,防守战力为0!你防个0战力的试试...
这叫内涵贴吗?
一看就是小学生毕业的
呵呵~~~~~
我说我PS 的你信么??
贴吧热议榜
使用签名档&&
保存至快速回贴Fragment全解析系列(一):那些年踩过的坑 - 简书
<div class="fixed-btn note-fixed-download" data-toggle="popover" data-placement="left" data-html="true" data-trigger="hover" data-content=''>
写了30480字,被2109人关注,获得了1735个喜欢
Fragment全解析系列(一):那些年踩过的坑
Fragment系列文章:1、Fragment全解析系列(一):那些年踩过的坑2、3、
本篇主要介绍一些最常见的Fragment的坑以及官方Fragment库的那些自身的BUG,并给出解决方案;这些BUG在你深度使用时会遇到,比如Fragment嵌套时或者单Activity+多Fragment架构时遇到的坑。
Fragment是可以让你的app纵享丝滑的设计,如果你的app想在现在基础上性能大幅度提高,并且占用内存降低,同样的界面Activity占用内存比Fragment要多,响应速度Fragment比Activty在中低端手机上快了很多,甚至能达到好几倍!如果你的app当前或以后有移植平板等平台时,可以让你节省大量时间和精力。
简陋的目录1、getActivity()空指针2、异常:Can not perform this action after onSaveInstanceState3、Fragment重叠异常-----正确使用hide、show的姿势4、Fragment嵌套的那些坑5、未必靠谱的出栈方法remove()6、多个Fragment同时出栈的深坑BUG7、深坑 Fragment转场动画
最新版知乎,单Activity多Fragment的架构,响应可以说非常“丝滑”,非要说缺点的话,就是没有转场动画,并且转场会有类似闪屏现象。我猜测可能和Fragment转场动画的一些BUG有关。(这系列的最后一篇文章我会给出我的解决方案,可以自定义转场动画,并能在各种特殊情况下正常运行。)
但是!Fragment相比较Activity要难用很多,在多Fragment以及嵌套Fragment的情况下更是如此。更重要的是Fragment的坑真的太多了,看Square公司的这篇文章吧,
当然,不能说不再用Fragment,Fragment的这些坑都是有解决办法的,官方也在逐步修复一些BUG。下面罗列一些,有常见的,也有极度隐蔽的一些坑,也是我在用单Activity多Fragment时遇到的坑,可能有更多坑可以挖掘...
在这之前为了方便后面文章的介绍,先规定一个“术语”,安卓app有一种特殊情况,就是 app运行在后台的时候,系统资源紧张的时候导致把app的资源全部回收(杀死app的进程),这时把app再从后台返回到前台时,app会重启。这种情况下文简称为:“内存重启”。(屏幕旋转等配置变化也会造成当前Activity重启,本质与“内存重启”类似)
在系统要把app回收之前,系统会把Activity的状态保存下来,Activity的FragmentManager负责把Activity中的Fragment保存起来。在“内存重启”后,Activity的恢复是从栈顶逐步恢复,Fragment会在宿主Activity的onCreate方法调用后紧接着恢复(从onAttach生命周期开始)。
getActivity()空指针
可能你遇到过getActivity()返回null,或者平时运行完好的代码,在“内存重启”之后,调用getActivity()的地方却返回null,报了空指针异常。
大多数情况下的原因:你在调用了getActivity()时,当前的Fragment已经onDetach()了宿主Activity。比如:你在pop了Fragment之后,该Fragment的异步任务仍然在执行,并且在执行完成后调用了getActivity()方法,这样就会空指针。
解决办法:更"安全"的方法:(对于Fragment已经onDetach这种情况,我们应该避免在这之后再去调用宿主Activity对象,比如取消这些异步任务,但我们的团队可能会有粗心大意的情况,所以下面给出的这个方案会保证安全)
在Fragment基类里设置一个Activity mActivity的全局变量,在onAttach(Activity activity)里赋值,使用mActivity代替getActivity(),保证Fragment即使在onDetach后,仍持有Activity的引用(有引起内存泄露的风险,但是异步任务没停止的情况下,本身就可能已内存泄漏,相比Crash,这种做法“安全”些),即:
protected Activity mA
public void onAttach(Activity activity) {
super.onAttach(activity);
this.mActivity =
如果你用了support 23的库,上面的方法会提示过时,有强迫症的小伙伴,可以用下面的方法代替
public void onAttach(Context context) {
super.onAttach(context);
this.mActivity = (Activity)
异常:Can not perform this action after onSaveInstanceState
有很多小伙伴遇到这个异常,这个异常产生的原因是:
在你离开当前Activity等情况下,系统会调用onSaveInstanceState()帮你保存当前Activity的状态、数据等,直到再回到该Activity之前(onResume()之前),你使用commit()提交了Fragment事务,就会抛出该异常!
解决方法2个:1、(不推荐)该事务使用commitAllowingStateLoss()方法提交,但是有可能导致该次提交无效!(在此次离开时恰巧Activity被强杀时)2、(推荐)在重新回到该Activity的时候(onResumeFragments()或onPostResume()),再执行该事务!
Fragment重叠异常-----正确使用hide、show的姿势
如果你add()了几个Fragment,使用show()、hide()方法控制,比如微信、QQ的底部tab等情景,如果你什么都不做的话,在“内存重启”后回到前台,app的这几个Fragment界面会重叠。
原因是FragmentManager帮我们管理Fragment,当发生“内存重启”,他会从栈底向栈顶的顺序一次性恢复Fragment;但是因为没有保存Fragment的mHidden属性,默认为false,即show状态,所以所有Fragment都是以show的形式恢复,我们看到了界面重叠。(如果是replace,恢复形式和Activity一致,只有当你pop之后上一个Fragment才开始重新恢复,所有使用replace不会造成重叠现象)
还有一种场景,add和replace都有可能造成重叠: 在onCreate中加载Fragment,并且没有判断saveInstanceState==null,导致重复加载了同一个Fragment导致重叠。(PS:replace情况下,如果没有加入回退栈,则不判断也不会造成重叠,但建议还是统一判断下)
protected void onCreate(@Nullable Bundle savedInstanceState) {
// 在页面重启时,Fragment会被保存恢复,而此时再加载Fragment会重复加载,导致重叠 ;
if(saveInstanceState == null){
// 正常情况下去 加载根Fragment
详细原因:
这里给出3个解决方案:1、是大家比较熟悉的 findFragmentByTag:
即在add()或者replace()时绑定一个tag,一般我们是用fragment的类名作为tag,然后在发生“内存重启”时,通过findFragmentByTag找到对应的Fragment,并hide()需要隐藏的fragment。
下面是个标准恢复写法:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity);
TargetFragment targetF
HideFragment hideF
if (savedInstanceState != null) {
// “内存重启”时调用
targetFragment = getSupportFragmentManager().findFragmentByTag(TargetFragment.class.getName);
hideFragment = getSupportFragmentManager().findFragmentByTag(HideFragment.class.getName);
// 解决重叠问题
getFragmentManager().beginTransaction()
.show(targetFragment)
.hide(hideFragment)
.commit();
targetFragment = TargetFragment.newInstance();
hideFragment = HideFragment.newInstance();
getFragmentManager().beginTransaction()
.add(R.id.container, targetFragment, targetFragment.getClass().getName())
.add(R.id,container,hideFragment,hideFragment.getClass().getName())
.hide(hideFragment)
.commit();
如果你想恢复到用户离开时的那个Fragment的界面,你还需要在onSaveInstanceState(Bundle outState)里保存离开时的那个可见的tag或下标,在onCreate“内存重启”代码块中,取出tag/下标,进行恢复。
2、使用getSupportFragmentManager().getFragments()恢复
通过getFragments()可以获取到当前FragmentManager管理的栈内所有Fragment。
标准写法如下:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity);
TargetFragment targetF
HideFragment hideF
if (savedInstanceState != null) {
// “内存重启”时调用
List&Fragment& fragmentList = getSupportFragmentManager().getFragments();
for (Fragment fragment : fragmentList) {
if(fragment instanceof TartgetFragment){
targetFragment = (TargetFragment)
}else if(fragment instanceof HideFragment){
hideFragment = (HideFragment)
// 解决重叠问题
getFragmentManager().beginTransaction()
.show(targetFragment)
.hide(hideFragment)
.commit();
targetFragment = TargetFragment.newInstance();
hideFragment = HideFragment.newInstance();
// 这里add时,tag可传可不传
getFragmentManager().beginTransaction()
.add(R.id.container)
.add(R.id,container,hideFragment)
.hide(hideFragment)
.commit();
从代码看起来,这种方式比较复杂,但是这种方式在一些场景下比第一种方式更加简便有效。我会在中介绍在不同场景下如果选择,何时用findFragmentByTag(),何时用getFragments()恢复。
顺便一提,有些小伙伴会用一种并不合适的方法恢复Fragment,虽然效果也能达到,但并不恰当。即:
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
getSupportFragmentManager().putFragment(outState, KEY, targetFragment);
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_scrolling);
if (savedInstanceState != null) {
Fragment targetFragment = getSupportFragmentManager().getFragment(savedInstanceState, KEY);
如果仅仅为了找回栈内的Fragment,使用putFragment(bundle, key, fragment)保存fragment,是完全没有必要的;因为FragmentManager在任何情况都会帮你存储Fragment,你要做的仅仅是在“内存重启”后,找回这些Fragment即可。。
3、我的解决方案,9行代码解决所有情况的Fragment重叠:
Fragment嵌套的那些坑
其实一些小伙伴遇到的很多嵌套的坑,大部分都是由于对嵌套的栈视图产生混乱,只要理清栈视图关系,做好恢复相关工作以及正确选择是使用getFragmentManager()还是getChildFragmentManager()就可以避免这些问题。
这部分内容是我们感觉Fragment非常难用的一个点,我会在中,详细介绍使用Fragment嵌套的一些技巧,以及如何清晰分析各个层级的栈视图。
附:startActivityForResult接收返回问题在support 23.2.0以下的支持库中,对于在嵌套子Fragment的startActivityForResult (),会发现无论如何都不能在onActivityResult()中接收到返回值,只有最顶层的父Fragment才能接收到,这是一个support v4库的一个BUG,不过在前两天发布的support 23.2.0库中,已经修复了该问题,嵌套的子Fragment也能正常接收到返回数据了!
未必靠谱的出栈方法remove()
如果你想让某一个Fragment出栈,使用remove()在加入回退栈时并不靠谱。
如果你在add的同时将Fragment加入回退栈:addToBackStack(name)的情况下,它并不能真正将Fragment从栈内移除,如果你在2秒后(确保Fragment事务已经完成)打印getSupportFragmentManager().getFragments(),会发现该Fragment依然存在,并且依然可以返回到被remove的Fragment,而且是空白页面。
如果你没有将Fragment加入回退栈,remove方法可以正常出栈。
如果你加入了回退栈,popBackStack()系列方法才能真正出栈,这也就引入下一个深坑,popBackStack(String tag,int flags)等系列方法的BUG。
多个Fragment同时出栈的深坑BUG
在Fragment库中如下4个方法是有BUG的:
1、popBackStack(String tag,int flags)2、popBackStack(int id,int flags)3、popBackStackImmediate(String tag,int flags)4、popBackStackImmediate(int id,int flags)
上面4个方法作用是,出栈到tag/id的fragment,即一次多个Fragment被出栈。
1、FragmentManager栈中管理fragment下标位置的数组ArrayList&Integer& mAvailIndeices的BUG
下面的方法FragmentManagerImpl类方法,产生BUG的罪魁祸首是管理Fragment栈下标的mAvailIndeices属性:
void makeActive(Fragment f) {
if (f.mIndex &= 0) {
if (mAvailIndices == null || mAvailIndices.size() &= 0) {
if (mActive == null) {
mActive = new ArrayList&Fragment&();
f.setIndex(mActive.size(), mParent);
mActive.add(f);
f.setIndex(mAvailIndices.remove(mAvailIndices.size()-1), mParent);
mActive.set(f.mIndex, f);
if (DEBUG) Log.v(TAG, "Allocated fragment index " + f);
上面代码最终导致了栈内顺序不正确的问题,如下图:
上面的这个情况,会一次异常,一次正常。带来的问题就是“内存重启”后,各种异常甚至Crash。
发现这BUG的时候,我一脸懵比,幸好,stackoverflow上有大神给出了!hack FragmentManagerImpl的mAvailIndices,对其进行一次Collections.reverseOrder()降序排序,保证栈内Fragment的index的正确。
public class FragmentTransactionBugFixHack {
public static void reorderIndices(FragmentManager fragmentManager) {
if (!(fragmentManager instanceof FragmentManagerImpl))
FragmentManagerImpl fragmentManagerImpl = (FragmentManagerImpl) fragmentM
if (fragmentManagerImpl.mAvailIndices != null && fragmentManagerImpl.mAvailIndices.size() & 1) {
Collections.sort(fragmentManagerImpl.mAvailIndices, Collections.reverseOrder());
使用方法就是通过popBackStackImmediate(tag/id)多个Fragment后,调用
hanler.post(new Runnable(){
public void run() {
FragmentTransactionBugFixHack.reorderIndices(fragmentManager));
2、popBackStack的坑popBackStack和popBackStackImmediate的区别在于前者是加入到主线队列的末尾,等其它任务完成后才开始出栈,后者是立刻出栈。
如果你popBackStack多个Fragment后,紧接着beginTransaction() add新的一个Fragment,接着发生了“内存重启”后,你再执行popBackStack(),app就会Crash,解决方案是postDelay出栈动画时间再执行其它事务,但是根据我的观察不是很稳定。我的建议是:如果你想出栈多个Fragment,你应尽量使用popBackStackImmediate(tag/id),而不是popBackStack(tag/id),如果你想在出栈后,立刻beginTransaction()开始一项事务,你应该把事务的代码post/postDelay到主线程的消息队列里,下一篇有详细描述。
深坑 Fragment转场动画
如果你的Fragment没有转场动画,或者使用setCustomAnimations(enter, exit)的话,那么上面的那些坑解决后,你可以愉快的玩耍了。
getFragmentManager().beginTransaction()
.setCustomAnimations(enter, exit)
// 如果你有通过tag/id同时出栈多个Fragment的情况时,
// 请谨慎使用.setCustomAnimations(enter, exit, popEnter, popExit)
// 因为在出栈多Fragment时,伴随出栈动画,会在某些情况下发生异常
// 你需要搭配Fragment的onCreateAnimation()临时取消出栈动画,或者延迟一个动画时间再执行一次上面提到的Hack方法,排序
(注意:如果你想给下一个Fragment设置进栈动画和出栈动画,.setCustomAnimations(enter, exit)只能设置进栈动画,第二个参数并不是设置出栈动画;请使用.setCustomAnimations(enter, exit, popEnter, popExit),这个方法的第1个参数对应进栈动画,第4个参数对应出栈动画,所以是.setCustomAnimations(进栈动画, exit, popEnter, 出栈动画))
总结起来就是Fragment没有出栈动画的话,可以避免很多坑。如果想让出栈动画运作正常的话,需要使用Fragment的onCreateAnimation中控制动画。
public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) {
// 此处设置动画
但是用代价也是有的,你需要解决出栈动画带来的几个坑。
1、pop多个Fragment时转场动画 带来的问题在使用 pop(tag/id)出栈多个Fragment的这种情况下,将转场动画临时取消或者延迟一个动画的时间再去执行其他事务;
原因在于这种情景下,如果发生“内存重启”后,因为Fragment转场动画没结束时再执行其他方法,会导致Fragment状态不会被FragmentManager正常保存下来。
2、进入新的Fragment并立刻关闭当前Fragment 时的一些问题(1)如果你想从当前Fragment进入一个新的Fragment,并且同时要关闭当前Fragment。由于数据结构是栈,所以正确做法是先pop,再add,但是转场动画会有覆盖的不正常现象,你需要特殊处理,不然会闪屏!
(2)Fragment的根布局要设置android:clickable = true,原因是在pop后又立刻add新的Fragment时,在转场动画过程中,如果你的手速太快,在动画结束前你多点击了一下,上一个Fragment的可点击区域可能会在下一个Fragment上依然可用。
Tip:如果你遇到Fragment的mNextAnim空指针的异常(通常是在你的Fragment被重启的情况下),那么你首先需要检查是否操作的Fragment是否为null;其次在你的Fragment转场动画还没结束时,你是否就执行了其他事务等方法;解决思路就是延迟一个动画时间再执行事务,或者临时将该Fragment设为无动画
看了上面的介绍,你可能会觉得Fragment有点可怕。
但是我想说,如果你只是浅度使用,比如一个Activity容器包含列表Fragment+详情Fragment这种简单情景下,不涉及到popBackStack/Immediate(tag/id)这些的方法,还是比较轻松使用的,出现的问题,网上都可以找到解决方案。
但是如果你的Fragment逻辑比较复杂,有特殊需求,或者你的app架构是仅有一个Activity + 多个Fragment,上面说的这些坑,你都应该全部解决。
在中,介绍了一些非常实用的使用技巧,包括如何解决Fragment嵌套、各种环境、组件下Fragment的使用等技巧,推荐阅读!
还有一些比较隐蔽的问题,不影响app的正常运行,仅仅是一些显示的BUG,并没有在上面介绍,在本系列的,我给出了我的解决方案,一个我封装的,解决了所有动画问题,非常适合单Activity+多Fragment 或者 多模块Activity+多Fragment的架构。有兴趣的可以看看 :)
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
被以下专题收入,发现更多相似内容:
如果你是程序员,或者有一颗喜欢写程序的心,喜欢分享技术干货、项目经验、程序员日常囧事等等,欢迎投稿《程序员》专题。
专题主编:小...
· 277932人关注
Android深入理解、基础详解及各种Library使用介绍。认真做技术,好好享受人生。。
· 5673人关注
Android开发相关知识和技巧,欢迎大家积极投稿~
· 3140人关注
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
选择支付方式:}

我要回帖

更多关于 令我印象深刻的一个人 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信