我在一个活动中有一个框架布局,我希望在其中显示不同的碎片。我有一个带有3个选项的滑动抽屉,每个选项都会导致在框架布局中加载一个片段。目前我使用以下内容来完成此任务:
Fragment nextFragment = determineFragmentToSwitchTo(nextFragmentTag);
transaction.replace(R.id.fragment_container, nextFragment);
第一种方法通过评估nextFragmentTag字符串并加载一个新的片段来确定我需要的片段:
if (fragmentTag.equals(Constants.STUDENTPAGE))
nextFragment = new StudentFragment();
else if (fragmentTag.equals(Constants.TEACHERPAGE))
nextFragment = new TeacherFragment();
else if (fragmentTag.equals(Constants.PARENTPAGE))
nextFragment = new ParentFragment();
显然,这种方法每次都会创建一个新的片段,并在不保存状态的情况下贯穿整个片段生命周期。因此,如果我在学生页面上并滚动浏览学生列表并切换到父页面,当我返回学生页面时,它会重新加载整个列表(我从服务器获取它)并丢失我的位置它。我怎样才能让它在管理器中保持状态和缓存该片段(如果有意义的话)?
答案 0 :(得分:1)
您可以使用FragmentTransaction's
hide(Fragment)
和show(Fragment)
方法,例如:
// In the parent Activity
StudentFragment studentFragment;
TeacherFragment teacherFragment;
ParentFragment parentFragment;
Fragment fragmentOnDisplay;
@Override
protected void onCreate(Bundle savedInstanceState) {
// Initialize fragmentManager, fragmentTransaction, etc.
studentFragment = (StudentFragment) fragmentManager.findFragmentByTag(Constants.STUDENTPAGE);
if (studentFragment == null) {
studentFragment = new StudentFragment ();
fragmentTransaction.add(R.id.your_frame_layout, studentFragment, Constants.STUDENTPAGE);
}
// repeat the same procedure for the other two fragments
// Suppose you want to begin with the teacherFragment on
// display - in that case hide the studentFragment and
// the parentFragment:
fragmentTransaction.hide(studentFragment);
fragmentTransaction.hide(parentFragment);
fragmentOnDisplay = teacherFragment;
fragmentTransaction.commit();
}
现在,只要您需要切换片段,只需显示hide
片段,然后show
您需要的片段,例如:
...
fragmentTransaction.hide(fragmentOnDisplay);
fragmentTransaction.show(parentFragment);
fragmentOnDisplay = parentFragment;
fragmentTransaction.commit();