我正在尝试探索如何通过Android框架管理片段,并通过我的研究我知道了许多关于片段我不知道的新事物,但我陷入了困境,无法弄清楚如何这种情况正在发生。
请先尝试了解我的情景。它是这样的: 我有一个Activity,它逐个添加两个片段。首次加载活动时,使用以下代码将片段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中,我有一个编辑文本,我在其中输入了一些文字。
当在Activity中单击按钮时,使用下面的代码将片段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();
}
在添加片段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的视图状态,即使savedInstanceState为null并且onCreateView在Fragment时返回一个全新的View对象A再次创建。
答案 0 :(得分:1)
最后我找到了答案here。
Android就是这样设计的。在这种情况下,视图状态保存/恢复在Fragment内部被调用。因此,每个在内部实现View State Saving / Restoring的View,例如EditText或带有android:freezeText =“true”的TextView,都将自动保存并恢复状态。使其显示与之前完全相同。