2013-09-27 40 views
0

好吧,我已經說過片段被無故刪除。在我看來,像這樣,但肯定有一個我不知道的原因。請幫我找到它。片段從沒有原因的背堆棧中刪除

我得到了FragmentActivity其中包含TabHost,有5個選項卡。 TabHostonTabChangedListener這樣的(這裏沒有什麼複雜的,只需用複製的代碼的情況下):

new OnTabChangeListener() { 
      @Override 
      public void onTabChanged(String arg0) { 
       LiveTabFragment fragment = null; 
       int viewHolder = -1; 
       switch (tabHost.getCurrentTab()) { 
       case TAB_ABOUT: 
        fragment = (LiveAboutFragment) getSupportFragmentManager().findFragmentByTag(LiveAboutFragment.class.getSimpleName()); 
        if (fragment == null) fragment = new LiveAboutFragment(); 
        viewHolder = R.id.live_tab_about; 
        break; 
       case TAB_EVENTS: 
        fragment = (LiveEventsFragment) getSupportFragmentManager().findFragmentByTag(LiveEventsFragment.class.getSimpleName()); 
        if (fragment == null) fragment = new LiveEventsFragment(); 
        viewHolder = R.id.live_tab_events; 
        break; 
       case TAB_PLAYERS: 
        fragment = (LivePlayersFragment) getSupportFragmentManager().findFragmentByTag(LivePlayersFragment.class.getSimpleName()); 
        if (fragment == null) fragment = new LivePlayersFragment(); 
        viewHolder = R.id.live_tab_players; 
        break; 
       case TAB_LEGEND: 
        fragment = (LiveLegendFragment) getSupportFragmentManager().findFragmentByTag(LiveLegendFragment.class.getSimpleName()); 
        if (fragment == null) fragment = new LiveLegendFragment(); 
        viewHolder = R.id.live_tab_legend; 
        break; 
       case TAB_CHAT: 
        fragment = (LiveChatFragment) getSupportFragmentManager().findFragmentByTag(LiveChatFragment.class.getSimpleName()); 
        if (fragment == null) fragment = new LiveChatFragment(); 
        viewHolder = R.id.live_tab_chat; 
        break; 
       } 

       if (fragment != null) injectInnerFragment(fragment, viewHolder, false); 
      } 
     } 

這裏是一個injectInnerFragment方法:

public void injectInnerFragment(AaFragment fragment, int viewHolderId, boolean addToBackStack) { 
    FragmentManager manager = getSupportFragmentManager(); 
    FragmentTransaction transaction = manager.beginTransaction(); 

    if (fragment.isAdded()) { 
     transaction.replace(viewHolderId, fragment, fragment.getClass().getSimpleName()); 
     if (addToBackStack) transaction.addToBackStack(null); 
     transaction.commit(); 
    } else { 
     transaction.add(viewHolderId, fragment, fragment.getClass().getSimpleName()); 
     if (addToBackStack) transaction.addToBackStack(null); 
     transaction.commit(); 
    }  
} 

現在的問題: 當我點擊thr的第一次碎片是beeing創建的(onCreate被稱爲)這是正常的。在大多數情況下,再次點擊已經創建的標籤片段不會調用片段的onCreate,這正是我想要的。這就是爲什麼我試圖找到片段,如果FragmentManager第一。

有兩種情況不起作用,先前創建的片段再次創建,這對我來說效率不高。這些案件是:

  • 如果我點擊任何選項卡,然後在TAB_ABOUT,那麼任何選項卡上再次單擊導致它重新創建(「任何標籤片段」在FragmentManager沒有找到)
  • 如果我點擊任何TAB_CHAT,然後再次點擊任何標籤導致它正在重新創建(「FragmentManager」中找不到任何製表符片段)

這是什麼樣的魔法?它是否有一些自動釋放內存,取決於片段「重量」?也許我應該存儲所有數據,我不想重新加載每個時間片段被創建在Activity上?

回答

0

看看你下面的代碼:

transaction.replace(viewHolderId, fragment, fragment.getClass().getSimpleName()); 

嘗試:

 transaction.add(viewHolderId, fragment, fragment.getClass().getSimpleName()); 
+0

,但不會是被添加相同片段如果我打開他們幾次的後臺? –

+0

那麼最新的問題呢? – Prachi

+0

問題是,原因是:java.lang.IllegalStateException:已經添加片段: –

0

通過modyfing注射方法解決了這個:

public void injectInnerFragment(AaFragment fragment, int viewHolderId, boolean addToBackStack) { 
    FragmentManager manager = getSupportFragmentManager(); 
    FragmentTransaction transaction = manager.beginTransaction(); 

    if (fragment.isAdded()) { 
     transaction.attach(fragment); 
     transaction.commit(); 
    } else { 
     transaction.add(viewHolderId, fragment, fragment.getClass().getSimpleName()); 
     if (addToBackStack) transaction.addToBackStack(null); 
     transaction.commit(); 
    }  
}