1

内部にさまざまなフラグメントを表示したいアクティビティにフレーム レイアウトがあります。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();

明らかに、このアプローチは毎回新しいフラグメントを作成し、状態を保存せずにフラグメントのライフサイクル全体を実行しています。したがって、学生ページで学生リストをスクロールして親ページに切り替えた場合、学生ページに戻ると、リスト全体がリロードされ(サーバーから取得しています)、自分の場所が失われますそれ。マネージャーでフラグメント化された状態とキャッシュの種類を永続化するにはどうすればよいですか (それが理にかなっている場合)。

4

1 に答える 1

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();
于 2013-08-26T18:41:40.667 に答える