0

わかりました、フラグメントは理由なく削除されると述べました。このように思えますが、確かに私にはわからない理由があります。見つけるのを手伝ってください。

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 回クリックしても、必要なフラグメントが呼び出されませんonCreateFragmentManagerそのため、最初にフラグメントを見つけようとしています。

うまくいかない場合が 2 つあります。以前に作成したフラグメントが再度作成されますが、これは効率的ではありません。ケースは次のとおりです。

  • 任意のタブをクリックしてから TAB_ABOUT をクリックすると、任意のタブをもう一度クリックすると再作成されます (「任意のタブフラグメント」は に見つかりませんFragmentManager)
  • 任意のタブをクリックしてから TAB_CHAT をクリックすると、任意のタブをもう一度クリックすると再作成されます (「任意のタブ フラグメント」は に見つかりませんFragmentManager)

これはどんな魔術ですか?フラグメントの「重み」に依存する自動メモリ解放ですか?代わりに、アクティビティでフラグメントが作成されるたびにリロードしたくないすべてのデータを保存する必要がありますか?

4

2 に答える 2

0

inject メソッドを変更することでこれを解決しました。

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();
    }       
}
于 2013-09-27T10:56:20.777 に答える