解决切换Fragment的黑色闪屏问题
2014-11-24 18:35
295 查看
转载请注明出处:http://blog.csdn.net/jiguangcanhen?viewmode=list
-----------------------------------------------------------------------------------------------------------
问题情景:
在Activity中切入Fragment,在Fragment中显示了Unity3D的view(对于地图的View应该是一个效果),在Activity中切换Fragment的时候,会出现黑色闪屏。切换方式使用的是replace方法。
原因:
因为u3d初始化和销毁的时候,资源比较多,所以耗费时间过长,所以会出现黑色闪屏,而replace方法恰恰是add和remove方法的结合,就会每次初始化和销毁。
解决办法:
不用replace方法来做,也就是说,只初始化一次,那么就是使用add之后利用hide和show方法来完成fragment的切换,这样的话,就解决的黑色闪屏的问题。
关键代码:
根据上面的方式,是可以解决fragment闪屏的问题,可以说,只是避开了,并不是真正解决了。
扩展:
问题:
因为我们没有remove方法,那么很简单的明白,我们activity的fragmentlist是一直在增加的,可能就是AFragment,BFragment,BFragment。
在activity切换到其他的activity之后(切换的时候activity显示的为AFragment),它们的生命周期行走的流程为:
onResume(activity)->onResume(AFragment)->onResume(BFragment)->onResume(BFragment)
可见,虽然,BFragment和CFragment没有显示,处于hide的状态,但是返回之后,还是会调用它们的onResume方法。
进一步引发问题:
因为我的titlebar是在MainActivity中进行的布局,在Fragment的onResume方法中进行的样式设置,那么如果是这种执行顺序,那么titlebar的样式肯定会出现错乱。
解决:
对于没有显示的方法,在activity执行onPause方法的时候进行remove,也就是下面方法的作用。从而可以解决放这个问题。
假设在remove了BFragment之后,堆栈情况如下:
AFragment,null,CFragment,它用null来继续了代替,size还是3。
并不是我们一般理解的:
AFragment,CFragment,然后size为2
-----------------------------------------------------------------------------------------------------------
问题情景:
在Activity中切入Fragment,在Fragment中显示了Unity3D的view(对于地图的View应该是一个效果),在Activity中切换Fragment的时候,会出现黑色闪屏。切换方式使用的是replace方法。
原因:
因为u3d初始化和销毁的时候,资源比较多,所以耗费时间过长,所以会出现黑色闪屏,而replace方法恰恰是add和remove方法的结合,就会每次初始化和销毁。
解决办法:
不用replace方法来做,也就是说,只初始化一次,那么就是使用add之后利用hide和show方法来完成fragment的切换,这样的话,就解决的黑色闪屏的问题。
关键代码:
public void changeFragment(int flag){ FragmentTransaction ft = fm.beginTransaction(); Fragment fragment = fm.findFragmentByTag(flag+""); boolean isShowOrAdd = true;//true表示show,false表示add if(fragment == null){ isShowOrAdd = false; switch(FragmentTags.values()[flag]){ case u3dFragment: fragment = new U3dFragment(); break; case functionFragment: fragment = new FunctionFragment(); break; case personalFragment: fragment = new PersonalFragment(); break; case cameraAddPeopleFragment: fragment = new AddNewPeopleFragment(); break; default: break; } } if(currentFragment != null){ ft.hide(currentFragment); } if(isShowOrAdd){ ft.show(fragment); fragment.onResume(); }else{ ft.add(R.id.contentContainer, fragment, flag+""); } currentFragment = fragment; ft.commit(); }
根据上面的方式,是可以解决fragment闪屏的问题,可以说,只是避开了,并不是真正解决了。
扩展:
问题:
因为我们没有remove方法,那么很简单的明白,我们activity的fragmentlist是一直在增加的,可能就是AFragment,BFragment,BFragment。
在activity切换到其他的activity之后(切换的时候activity显示的为AFragment),它们的生命周期行走的流程为:
onResume(activity)->onResume(AFragment)->onResume(BFragment)->onResume(BFragment)
可见,虽然,BFragment和CFragment没有显示,处于hide的状态,但是返回之后,还是会调用它们的onResume方法。
进一步引发问题:
因为我的titlebar是在MainActivity中进行的布局,在Fragment的onResume方法中进行的样式设置,那么如果是这种执行顺序,那么titlebar的样式肯定会出现错乱。
解决:
对于没有显示的方法,在activity执行onPause方法的时候进行remove,也就是下面方法的作用。从而可以解决放这个问题。
private void removeNeedFragment(){ List<Fragment> list = fm.getFragments(); System.out.println(list.size()+list.toString()); if(currentFragment instanceof U3dFragment){ for(int i = 0 ; i <= list.size() - 1; i++){ Fragment fragment = list.get(i); if(fragment instanceof PersonalFragment || fragment instanceof FunctionFragment || fragment instanceof AddNewPeopleFragment){ FragmentTransaction ft = fm.beginTransaction(); ft.remove(fragment); ft.commit(); } } }else if(currentFragment instanceof PersonalFragment){ for(int i = 0 ; i <= list.size() - 1; i++){ Fragment fragment = list.get(i); if(fragment instanceof FunctionFragment || fragment instanceof AddNewPeopleFragment){ FragmentTransaction ft = fm.beginTransaction(); ft.remove(fragment); ft.commit(); } } } }ps:
假设在remove了BFragment之后,堆栈情况如下:
AFragment,null,CFragment,它用null来继续了代替,size还是3。
并不是我们一般理解的:
AFragment,CFragment,然后size为2
相关文章推荐
- FragmentTabHost切换Fragment时避免重复加载UI,导致切换后重绘页面的问题解决
- 解决ViewPager上多个Fragment之间切换被重新实例化的问题
- fragment里面嵌套ViewPager,解决切换fragment了之后ViewPager中的内容消失的问题
- MapView 和ViewPager Fragment切换黑屏问题解决方案
- 解决当使用hide()和show()在多个Fragment 切换时,出现的重叠问题
- jquery mobile 解决切换页面时,闪屏,白屏等问题
- js切换导航菜单背景图片时的闪屏问题解决
- 解决 百度地图+slidingmenu 切换Fragment闪黑屏问题
- Android解决Fragment中使用SurfaceView切换时闪一下黑屏的问题
- Android学习之解决多个Fragment切换时重新实例化的问题
- FragmentTabHost切换Fragment时避免重复加载UI,导致切换后重绘页面的问题解决
- 【Android】解决RadioButton+FragmentPagerAdapter+Fragment切换页面数据加载的问题
- 解决Fragment中使用地图,切换会闪一下黑屏的问题
- Activity中包含多个Fragment,Afragment中嵌套ViewPager,在第二次切换到Afragment时Viewpager内容被清空的问题解决
- 解决Fragment中使用地图,切换会闪一下黑屏的问题
- 解决基于SlidingMenu的fragment切换后edittext无法获取焦点的问题
- 解决jquery mobile+phonegap页面切换闪屏问题
- 解决Fragment中使用map,切换会闪一下黑屏的有关问题
- 解决Fragment在Viepager中切换不保存状态的问题
- Android—解决Mapview和其他界面切换出现闪屏的问题(同事想法)