转载请注明出处: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的切换,这样的话,就解决的黑色闪屏的问题。
关键代码:
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