好的,我已经说过没有理由删除了碎片。在我看来,像这样,但肯定有一个我不知道的原因。请帮我找到。
我得到了包含FragmentActivity
的{{1}},其中有5个标签。 TabHost
有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
。这就是我为什么要首先找到onCreate
片段的原因。
有两种情况它不起作用,之前创建的片段再次创建,这对我来说效率不高。案例是:
FragmentManager
中找不到“任何标签片段”)FragmentManager
中找不到“任何标签片段”)这是什么样的巫术?它是一些自动内存释放,取决于片段“重量”?也许我应该存储我不希望每次在Activity上创建片段时重新加载的所有数据?
答案 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();
}
}