解决切换Fragment的黑色闪屏问题

转载请注明出处: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


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值