わかりました、フラグメントは理由なく削除されると述べました。このように思えますが、確かに私にはわからない理由があります。見つけるのを手伝ってください。
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();
}
}
今問題:
初めてタブをクリックすると、フラグメントが作成されます(onCreate
呼び出されます)が正常です。ほとんどの場合、既に作成されたタブ フラグメントを 2 回クリックしても、必要なフラグメントが呼び出されませんonCreate
。FragmentManager
そのため、最初にフラグメントを見つけようとしています。
うまくいかない場合が 2 つあります。以前に作成したフラグメントが再度作成されますが、これは効率的ではありません。ケースは次のとおりです。
- 任意のタブをクリックしてから TAB_ABOUT をクリックすると、任意のタブをもう一度クリックすると再作成されます (「任意のタブフラグメント」は に見つかりません
FragmentManager
) - 任意のタブをクリックしてから TAB_CHAT をクリックすると、任意のタブをもう一度クリックすると再作成されます (「任意のタブ フラグメント」は に見つかりません
FragmentManager
)
これはどんな魔術ですか?フラグメントの「重み」に依存する自動メモリ解放ですか?代わりに、アクティビティでフラグメントが作成されるたびにリロードしたくないすべてのデータを保存する必要がありますか?