首页 文章

Android:每次点击导航抽屉项目或加载以前创建的片段时,创建新片段会更好吗?

提问于
浏览
27

我正在实现android的标准导航抽屉模式,用户可以从抽屉导航到大约10个片段 . 目前,我每次点击不同的导航抽屉项目时都会创建一个新的片段,如下所示:

// When a new navigation item at index is clicked 
FragmentTransaction ft = fragmentManager.beginTransaction();
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
Fragment newFragment = null;
if (index == 0)
    fragment = new Fragment0();
...
ft.replace(R.id.container, newFragment);
ft.commit();

我一直想知道做以下事情会更有效率:

// Somewhere in onCreate
Fragment[] fragments = new Fragment[n];
fragments[0] = new Fragment0();
fragments[1] = new Fragment1();
...

// When a new navigation item (at index) is clicked 
FragmentTransaction ft = fragmentManager.beginTransaction();
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.replace(R.id.container, fragments[index]);
ft.commit();

我主要担心的是,一些片段拥有大量数据(相当大的列表和大量视图) . 是否存在将所有这些片段保存在内存中的任何问题,并且它是否会提供每次实例化新片段的任何优势(除了片段之间的更快切换)?有一个普遍接受的'更好'的解决方案吗?

1 回答

  • 5

    我有类似的问题 . 我采取了类似于你的方法,并为了节省处理器的负载我做了以下调整 every 调用为Fragment对象创建一个实例:(在我在selectItem方法中使用的上下文中)

    switch (position) {
        case 0:
            if (fragmentOne == null)
                fragmentOne = new FragmentOne();
            getSupportFragmentManager().beginTransaction().......
            break;
        case 1:
            if (fragmentTwo == null)
                fragmentTwo = new FragmentTwo();
            getSupportFragmentManager()......
    

    FragmentOne和FragmentTwo是两个不同的Fragment类,fragmentOne和fragmentTwo是它们在MainActivity中声明为字段的对象

    Edit

    我想补充一下如何使用包含片段的数组的类似方法 . 而不是在onCreate中创建新片段,而是在单击项目时执行此操作 . 在onCreate中,向抽屉发送一个调用,以选择在启动时默认选择的片段 .

    //somewhere in onCreate
    if (savedInstanceState == null) {
        selectItem(defaultFragment);
    }
    else
        selectItem(selectedFragment);
    //selectItem is method called by DrawerItemClickListener as well
    
    
    //in selectItem: when navigation item at index is clicked, the listener calls this
    switch (index) {
        case 0:
            if (fragments == null) {
                fragments = new Fragment[n];
                fragment[0] = new Fragment0();
            }
            else if (fragments[0] == null) {
                fragments[0] = new Fragment0();
            }
            break;
        ....
    }
    FragmentTransaction ft = fragmentManager.beginTransaction();
    ...
    ft.replace(R.id.container, fragments[index]);
    ft.commit();
    

    无需在onCreate上实例化片段,因为这会使启动变慢 . 在需要时创建它们,然后使用相同的一个(如果存在) . 只有在第一次加载新片段时才会创建新片段 .

相关问题