我正在使用一个有 4 个页面的 ViewPager,并且我正在寻找一种有效的方法来替换/切换每个页面中的片段。
这是我正在尝试创建的交互模式:
- 用户在当前包含片段 A 的页面上按下按钮
- 片段 A 被替换为一些新的片段 B
- 用户在片段 B 中做一些工作,然后在他/她完成后按下按钮
- 片段 B 被移除,并被片段 A(原始片段)替换
我找到了一种方法来做到这一点,但它似乎有很大的缺陷。该解决方案涉及删除原始片段,然后覆盖getItemPosition
(基本上是此相关问题中描述的方法):
//An array to keep track of the currently visible fragment in each page
private final Fragment[] activeFragments= new Fragment[4];
public void openFragmentB(ViewPager pager, int position) {
startUpdate(pager);
//Remove the original fragment
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.remove(activeFragments[position]);
transaction.commit();
//Create a new tile search fragment to replace the original fragment
activeFragments[position] = FragmentB.newInstance();
pageStates[position] = PageState.STATE_B;
finishUpdate(pager);
notifyDataSetChanged();
}
@Override
public int getItemPosition(Object object) {
//If the main fragment is not active, return POSITION_NONE
if(object instanceof FragmentA) {
FragmentA a = (FragmentA) object;
if(pageStates[a.getPosition()] != PageState.STATE_A) {
return POSITION_NONE;
}
}
//If the secondary fragment is not active, return POSITION_NONE
if(object instanceof FragmentB) {
FragmentB b = (FragmentB) object;
if(pageStates[b.getPosition()] != PageState.STATE_B) {
return POSITION_NONE;
}
}
return POSITION_UNCHANGED;
}
这种方法有效,但有不良副作用。移除片段并将其位置设置为 POSITION_NONE 会导致片段被销毁。因此,当用户完成使用 FragmentB 时,我需要创建一个新的 FragmentA 实例,而不是重用原始片段。寻呼机中的主要片段(本例中为 FragmentA)将包含相对较大的数据库支持列表,因此我希望尽可能避免重新创建它们。
本质上,我只想保留对我的 4 个主要片段的引用,并将它们换入和换出页面,而不必每次都重新创建它们。有任何想法吗?