无理由从后端堆栈中删除碎片

时间:2013-09-27 09:48:45

标签: android android-fragments

好的,我已经说过没有理由删除了碎片。在我看来,像这样,但肯定有一个我不知道的原因。请帮我找到。

我得到了包含FragmentActivity的{​​{1}},其中有5个标签。 TabHostTabHost这样的(这里没什么复杂的,只是复制代码的情况):

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。这就是我为什么要首先找到onCreate片段的原因。

有两种情况它不起作用,之前创建的片段再次创建,这对我来说效率不高。案例是:

  • 如果我点击任何标签,然后点击TAB_ABOUT,然后再点击任意标签会导致重新创建(FragmentManager中找不到“任何标签片段”)
  • 如果我点击任何标签,然后点击TAB_CHAT,然后再点击任何标签会导致重新创建(FragmentManager中找不到“任何标签片段”)

这是什么样的巫术?它是一些自动内存释放,取决于片段“重量”?也许我应该存储我不希望每次在Activity上创建片段时重新加载的所有数据?

2 个答案:

答案 0 :(得分:0)

请查看以下代码:

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

尝试:

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

答案 1 :(得分:0)

通过修改注入方法来解决这个问题:

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();
    }       
}