2012-04-03 77 views
2

在我的Android應用程序中,我有片段,其中一個非常沉重(它從網上加載了很多東西),另一個是輕的(如設置面板)。替換一個片段沒有onDestroy

我的東西片段之間切換這樣的:

private Fragment myFragment1; 
private Fragment myFragment2; 
...... 
FragmentManager fm = getSupportFragmentManager(); 
FragmentTransaction ft = fm.beginTransaction(); 
ft.replace(R.id.main_fragment, myFragment2); 
ft.commit(); 

我的問題是,它會在的onStop()和片段的onDestroy()時,它的beeing更換。 而且因爲我不釋放我的沉重的onDestroy東西()我有一個大的內存泄漏...

我想保持在內存中我所有的碎片,只顯示/從屏幕上隱藏起來。 這將是一個很好的做一個快速切換屏幕,而不是每次加載一切。

因此,問題是: 如何更改我的代碼以將所有片段保留在內存中? 我想有sonething像:

Fragment1.onPause(); 
Fragment2.onResume(); 

而不是:

Fragment1.onPause(); 
Fragment1.onStop(); 
Fragment1.onDestroy(); 
Fragment2.onCreate(); 
Fragment2.onResume(); 

還有一兩件事,我用android.support.v4.app.Fragment在Android 2.2及以上。

非常感謝!

編輯1:

我發現了一些幫助,我做了這樣的功能:

private void changeFragement(Fragment f, String fragmentTag) { 
    try { 
     if (f != null && fragmentTag != null) { 

      fm = getSupportFragmentManager(); 
      ft = fm.beginTransaction(); 
      Fragment currentFragment = fm.findFragmentById(R.id.main_fragment); 
      if (currentFragment != null) 
       ft.hide(currentFragment); 

      Fragment cachedFragment = fm.findFragmentByTag(fragmentTag); 
      if (cachedFragment == null) 
       ft.add(R.id.main_fragment, f, fragmentTag); 
      else 
       ft.show(f);    

      /*Fragment cachedFragment = fm.findFragmentByTag(fragmentTag); 
      if (cachedFragment == null) 
       cachedFragment = f; 
      ft.replace(R.id.main_fragment, cachedFragment, fragmentTag);*/ 

      ft.addToBackStack(null); 
      ft.commit(); 

     } 
    } catch (IllegalStateException err) { 
    } 
} 

的問題是,碎片沒有得到很好的替代,我不明白逢的「FT .addToBackStack(null);「... 你能幫我糾正這段代碼嗎?

回答

1

你不能。 Android處理活動,服務等的生命週期......包括碎片。 你需要重新認爲你這樣做。

我知道文檔中有關於「背景」片段的內容。也許你可以在其中加載,並與顯示/隱藏的其他片段分享一些狀態?

+0

oups,我會編輯我的第一篇文章... – Niko 2012-04-03 16:29:29