持续碎片状态

时间:2013-08-26 14:19:39

标签: java android android-listview android-fragments

我在一个活动中有一个框架布局,我希望在其中显示不同的碎片。我有一个带有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();

显然,这种方法每次都会创建一个新的片段,并在不保存状态的情况下贯穿整个片段生命周期。因此,如果我在学生页面上并滚动浏览学生列表并切换到父页面,当我返回学生页面时,它会重新加载整个列表(我从服务器获取它)并丢失我的位置它。我怎样才能让它在管理器中保持状态和缓存该片段(如果有意义的话)?

1 个答案:

答案 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();