如何在不重新启动的情况下重新使用片段

时间:2015-04-10 20:06:25

标签: android android-fragments

**** android开发中的新蜜蜂****

我有3个片段(每个片段作为我主要活动的标签栏)

我想重新使用我最初通过“新”调用创建的片段的已保存实例,但是如果我切换标签并返回到相同的片段,我如何使用保存的实例而不是始终创建OnCreateView上的新片段。

以下是我调用片段的方式:

private void launchFragment(int pos) {
    fragments = new ArrayList<Fragment>();  
    titles = new ArrayList<String>(); 

    titles.add("A");
    fragments.add(new AList());

    titles.add("B");
    fragments.add(new BList());

    titles.add("C");
    fragments.add(new CList());

    Fragment f = fragments.get(pos);
    String title = titles.get(pos);
    if (f != null) {
        while (getSupportFragmentManager().getBackStackEntryCount() > 0) {
            getSupportFragmentManager().popBackStackImmediate();
        }
        getSupportFragmentManager().beginTransaction()
            .replace(R.id.content_frame, f).addToBackStack(title)
            .commit();
        if (adapter != null) adapter.setSelection(pos);
    }
}

1 个答案:

答案 0 :(得分:1)

就像一个想法,将片段存储在ArrayList中,并按位置

访问它
// define as instance propertIES
private List<Fragment> fragments; <-- 
private List<String> titles; <-- define as instance property

// create ArrayLists in constructor or in onCreate, or othen place
fragments = new ArrayList<Fragment>(); <-- 
titles = new ArrayList<Fragment>(); <-- create ArrayList

// fill it with fragments
fragments.add(new AList());
fragments.add(new BList());
fragments.add(new CList());

// fill titles
titles.add("A");
titles.add("B");
titles.add("C");

private void launchFragment(int pos) {
    Fragment f = fragments.get(pos);
    String title = titles.get(pos);

    if (f != null) {
        while (getSupportFragmentManager().getBackStackEntryCount() > 0) {
            getSupportFragmentManager().popBackStackImmediate();
        }
        getSupportFragmentManager().beginTransaction()
            .replace(R.id.content_frame, f).addToBackStack(title)
            .commit();
        if (adapter != null) adapter.setSelection(pos);
    }
}

这只是众多解决方案中的一种。作为改进,您可以将ENUM与类名一起用作元素,然后在switch case中使用它,或者使用Map *而不是ArrayList。您可以从Fragments继承并添加title属性,并将其存储在object中,而不是存储在不同的数组中。

此外,您可以通过“请求”创建片段。在我的例子中,我一次创建所有实例。当你真的不需要它们时,不是最好的解决方案。更好的解决方案是在需要时创建片段,但将其存储以供后用。

有很多解决方案。你必须选择能比其他人更好地解决问题的那个。