解決切換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
相關文章
- 解決js控制元素背景圖片切換時的閃屏問題JS
- Ubuntu 16.04 Vysor 破解 和黑屏問題解決+ 閃屏問題解決Ubuntu
- DNS解析(網路切換的問題解決)DNS
- Android 解決表情皮膚和軟鍵盤切換時跳閃的問題Android
- 使用雙快取解決 Canvas clearRect 引起的閃屏問題快取Canvas
- Android中Fragment巢狀Fragment,切換Fragment時不顯示檢視的原因及解決方法AndroidFragment巢狀
- [iOS]終極橫豎屏切換解決方案iOS
- 解決webpack-dev-server代理常切換問題WebdevServer
- dialog橫豎屏切換時消失的解決方法
- Android 解決Activity切換時出現白屏問題Android
- Android解決Activity切換時出現白屏問題Android
- 用getChildFragmentManager解決Fragment巢狀Fragment資料丟失的問題Fragment巢狀
- 完美解決setInterval在瀏覽器切換時加速的問題瀏覽器
- 快速解決cmd中不同盤之間不能切換的問題
- 解決無法切換到jenkins使用者的問題Jenkins
- VNC FOR AIX 灰屏的問題解決VNCAI
- 記錄recyclerview的閃退問題解決View
- 自定義Navigator切換fragmentFragment
- 11gR2 RAC使用SCAN故障切換問題的解決方案
- Windows 7寬屏遊戲黑色邊框解決方法Windows遊戲
- pyinstaller閃退問題解決方法
- [貝聊科技] iOS 終極橫豎屏切換解決方案iOS
- Sdk Manager.exe 閃退問題的解決
- 如何在直播中解決黑屏、花屏、閃屏問題 | 直播疑難雜症排查
- 如何解決setInterval 與頁面切換問題
- Android Activity跳轉閃屏問題Android
- 信創雲盤,解決雙系統切換的資料交換同步問題
- pyinstaller 生成 exe 的閃退問題解決方案
- vue渲染時閃爍{{}}的問題及解決方法Vue
- Android Fragment實現按鈕間的切換AndroidFragment
- android轉屏,切換螢幕,橫豎屏(onConfigurationChanged)會重新 OnCreate 的解決方案Android
- iOS 橫豎屏切換iOS
- 新浪微博共享登入後無法退出切換賬號問題解決
- 【Android Fragment】解決ViewPager巢狀時Fragment的mUserVisibleHint屬性不同步的問題AndroidFragmentViewpager巢狀
- 【Android Fragment】解決Fragment多層巢狀時onActivityResult無法正確回撥的問題AndroidFragment巢狀
- win10 mysql閃退怎麼解決_解決win10 mysql閃退問題Win10MySql
- 解決Xamarin Android SDK Manager閃退問題Android
- jQueryMobile 轉場閃屏之終極解決jQuery