**** 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);
}
}
答案 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中,而不是存储在不同的数组中。
此外,您可以通过“请求”创建片段。在我的例子中,我一次创建所有实例。当你真的不需要它们时,不是最好的解决方案。更好的解决方案是在需要时创建片段,但将其存储以供后用。
有很多解决方案。你必须选择能比其他人更好地解决问题的那个。