片段如何恢复其视图状态?

时间:2017-01-08 18:30:48

标签: android android-fragments fragment

我正在尝试探索如何通过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再次创建。

1 个答案:

答案 0 :(得分:1)

最后我找到了答案here

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