我在我的应用程序中使用NavigationDrawer,抽屉中的每个菜单项都是一个片段。每当用户选择一个菜单项时,我将主容器中的当前片段替换为所请求的片段,但它每次都会重新创建片段,所以我更新了我的代码以重用现有的片段,而不是一次又一次地创建它们,因为片段的内容保持不变。我显示片段的更新代码是:
public void showTabFragment() {
TabFragment Tf = (TabFragment) mFragmentManager.findFragmentByTag(Constants.TAB_FRAGMENT);
mFragmentTransaction = mFragmentManager.beginTransaction();
if (Tf != null) {
mFragmentTransaction.replace(R.id.containerView, Tf, Constants.TAB_FRAGMENT);
} else {
mFragmentTransaction.replace(R.id.containerView, new TabFragment(), Constants.TAB_FRAGMENT);
}
mFragmentTransaction.commit();
}
在上面的代码中,我试图通过Tag获取片段,但它总是返回null并执行else case(新片段)。有人可以指导我在代码中做错了吗?
答案 0 :(得分:1)
我猜您显示的代码是针对您的某个菜单片段的?如果是这种情况,可能发生的是每次打开菜单项时,容器将被新片段(例如,片段B)替换为新标签(例如,TAG'B')。因此,当您尝试使用它的标记(TAG'A')打开前一个片段(比如片段A)时,它就不会存在,因为这就是您所替换的内容。
一种可能的解决方案是在创建片段时保留对片段的引用,例如散列映射,并重新使用它们。
private HashMap<String, Fragment> menuFragments = new HashMap<>();
public void showMenu(String fragmentID)
{
MenuFragment fragment = menuFragments.get(fragmentID);
if(fragment == null)
{
fragment = new MenuFragment(); //Create the respective menu fragment based on the ID.
menuFragments.put(fragmentID, fragment);
}
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.containerView, fragment, fragmentID);
transaction.commit();
}