如何重用FragmentManager中的现有片段而不是重新创建它们?

时间:2016-12-09 04:44:55

标签: android performance android-fragments

我在我的应用程序中使用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(新片段)。有人可以指导我在代码中做错了吗?

1 个答案:

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