关于android:fragment如何恢复其视图状态?

How fragment is restoring its view state?

我正在尝试探索 android 框架如何管理 Fragment,通过我的研究,我了解了很多我不了解 Fragment 的新事物,但我一度陷入困境并且无法理解看看这是怎么发生的。

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

1
2
3
4
5
6
7
8
9
private void initFirstFragment(){
    Bundle bundle = new Bundle();
    bundle.putString("TEXT_TO_SHOW","FIRST ACTIVITY\
FIRST DUMMY FRAGMENT");
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.replace(R.id.frameLayoutFragmentContainer, FirstDummyFragment.newInstance(bundle), FirstDummyFragment.class.getSimpleName());
    fragmentTransaction.addToBackStack(null);
    fragmentTransaction.commit();
}

Fragment A 加载时调用的这些回调方法

FirstDummyFragment: onCreate: savedInstanceState--->null

FirstDummyFragment: onCreateView: savedInstanceState--->null

FirstDummyFragment: onResume

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

当在 Activity 中单击按钮时,使用以下代码将片段 B 添加到同一容器中:

1
2
3
4
5
6
7
8
9
public void openSecondFragment() {
    Bundle bundle = new Bundle();
    bundle.putString("TEXT_TO_SHOW","FIRST ACTIVITY\
SECOND 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

当我按下返回按钮时,Fragment B 被销毁,Fragment A 进入前台并调用下面的回调方法

SecondDummyFragment: onDestroyView

SecondDummyFragment: onDestroy

SecondDummyFragment: onDetach

FirstDummyFragment: onCreateView: savedInstanceState--->null

FirstDummyFragment: onResume

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


我终于在这里找到了答案。

Android 就是这样设计的。在这种情况下,视图状态保存/恢复在 Fragment 内部调用。因此,每个在内部实现了视图状态保存/恢复的单个视图,例如带有 android:freezeText="true" 的 EditText 或 TextView,将自动保存和恢复状态。使其显示与以前完全相同。