重用相同的Fragment实例

时间:2016-02-17 12:03:05

标签: android android-fragments

我想让Android应用程序更少内存昂贵 并且奇怪有没有办法重用一个片段的实例而不重新创建它? 在我的应用程序中,我有一些片段(内存昂贵)
并且用户通常在它们之间导航很多次。

使用背堆不能让我达到预期目的 例如,如果我以这种方式向后堆栈添加事务:
FragA - > FragB - > FragC - > FragD
当用户使用popBackStack("FragA.class.getSimpleName()", 0)返回FragA(应用程序中的主菜单)时,
我失去了FragB - > FragC - > FragD实例。
然后当用户导航方向相同时: FragA - > FragB - > FragC - > FragD
最后3个片段必须再次创建。

我尝试过这里建议的解决方案: Can fragment be created with only one instance
How to keep only one instance of a fragment, when switching with NavigationDrawer?
但他们都没有帮助。

我最终得到了这个解决方案,但它仍然不起作用:

private FragmentManager mFragmentManager;
private HashMap<String, Fragment> mFragmentsMap;

@Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mFragmentManager = getSupportFragmentManager();
        mFragmentsMap = new HashMap<>();

// ...

}


public void switchFragment(Fragment fragment) {

//      getting Fragment name
        String fragmentName = fragment.getClass().getSimpleName();

//      checking whether fragment has been created
        Fragment usedFragment = mFragmentsMap.get(fragmentName);

        FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction();

        if (usedFragment == null) {
//            don't have fragment created
//            creating new one and putting to the map
            fragmentTransaction.replace(R.id.contentPanel, fragment, fragmentName);
            mFragmentsMap.put(fragmentName, fragment);

        } else {
         // having needed Fragment created
         // so reusing it
            fragmentTransaction.replace(R.id.contentPanel, usedFragment, fragmentName);

        }

        fragmentTransaction.commit();
    }

在这种情况下,有趣的情况发生了:
如果来自FragD我想使用
返回FragA     switchFragment(FragA);
HashMap已经拥有FragA实例,我正在替换它 带有usedFragment的容器(来自上面的方法),
但不知何故,FragA再次被创造出来。

我错过了什么?

0 个答案:

没有答案