您的位置:首页 > 其它

解决切换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的切换,这样的话,就解决的黑色闪屏的问题。

关键代码:

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐