我试图探索如何通过android框架管理片段,并且通过研究,我了解了很多我不知道的关于片段的新知识,但我一度陷入困境,无法弄清这是怎么回事。

请尝试先了解我的情况。就像这样:
我有一个活动,它一个接一个地添加两个片段。首次加载活动后,将使用以下代码将片段A附加到该活动:

private void initFirstFragment(){
    Bundle bundle = new Bundle();
    bundle.putString("TEXT_TO_SHOW", "FIRST ACTIVITY\nFIRST DUMMY FRAGMENT");
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.replace(R.id.frameLayoutFragmentContainer, FirstDummyFragment.newInstance(bundle), FirstDummyFragment.class.getSimpleName());
    fragmentTransaction.addToBackStack(null);
    fragmentTransaction.commit();
}


片段A的这些回调方法在加载时被调用


  FirstDummyFragment:onCreate:savedInstanceState ---> null
  
  FirstDummyFragment:onCreateView:savedInstanceState ---> null
  
  FirstDummyFragment:onResume


现在在片段A中,我有一个编辑文本,并在其中输入了一些文本。

当单击“活动”内部的按钮时,将使用以下代码将片段B添加到同一容器中:

public void openSecondFragment() {
    Bundle bundle = new Bundle();
    bundle.putString("TEXT_TO_SHOW", "FIRST ACTIVITY\nSECOND DUMMY FRAGMENT");
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.replace(R.id.frameLayoutFragmentContainer, SecondDummyFragment.newInstance(bundle), SecondDummyFragment.class.getSimpleName());
    fragmentTransaction.addToBackStack(null);
    fragmentTransaction.commit();
}


添加Fragment B后将调用以下回调方法


  SecondDummyFragment:onCreate:savedInstanceState ---> null
  
  FirstDummyFragment:onDestroyView
  
  SecondDummyFragment:onCreateView
  
  SecondDummyFragment:onResume


当我按下后退按钮时,片段B被破坏,片段A进入​​前台,在下面的回调方法被调用


  SecondDummyFragment:onDestroyView
  
  SecondDummyFragment:onDestroy
  
  SecondDummyFragment:onDetach
  
  FirstDummyFragment:onCreateView:savedInstanceState ---> null
  
  FirstDummyFragment:onResume


并且片段A的编辑文本包含与我在添加片段B之前输入的文本相同的文本。我很困惑android如何恢复片段A的视图状态,即使saveInstanceState为null且创建片段A时onCreateView返回一个全新的View对象再次。

最佳答案

最后,我找到了答案here

Android是以此方式设计的。在这种情况下,视图状态保存/恢复在Fragment内部被调用。结果,内部实现视图状态保存/恢复的每个单个视图(例如EditText或具有android:freezeText =“ true”的TextView)将自动保存并恢复状态。使它显示与以前完全相同。

10-08 01:47