我试图探索如何通过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)将自动保存并恢复状态。使它显示与以前完全相同。