好吧,我已經說過片段被無故刪除。在我看來,像這樣,但肯定有一個我不知道的原因。請幫我找到它。片段從沒有原因的背堆棧中刪除
我得到了FragmentActivity
其中包含TabHost
,有5個選項卡。 TabHost
有onTabChangedListener
這樣的(這裏沒有什麼複雜的,只需用複製的代碼的情況下):
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上?
,但不會是被添加相同片段如果我打開他們幾次的後臺? –
那麼最新的問題呢? – Prachi
問題是,原因是:java.lang.IllegalStateException:已經添加片段: –