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

Android 片段如何恢复其视图状态?,android,android-fragments,fragment,Android,Android Fragments,Fragment,我试图探索安卓框架是如何管理碎片的,通过我的研究,我了解了很多关于碎片的新事物,但有一点我被卡住了,无法理解这是如何发生的 请先试着理解我的情况。事情是这样的: 我有一个活动,一个接一个地添加两个片段。首次加载活动时,使用以下代码将片段A附加到该活动: private void initFirstFragment(){ Bundle bundle = new Bundle(); bundle.putString("TEXT_TO_SHOW", "FI

我试图探索安卓框架是如何管理碎片的,通过我的研究,我了解了很多关于碎片的新事物,但有一点我被卡住了,无法理解这是如何发生的

请先试着理解我的情况。事情是这样的: 我有一个活动,一个接一个地添加两个片段。首次加载活动时,使用以下代码将片段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();
}
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();
}
片段A的这些回调方法在加载时被调用

FirstDummyFragment:onCreate:savedInstanceState-->null

FirstDummyFragment:onCreateView:savedInstanceState-->null

FirstDummyFragment:onResume

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

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

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();
}
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

第二个片段:onDestroy

第二个片段:onDetach

FirstDummyFragment:onCreateView:savedInstanceState-->null

FirstDummyFragment:onResume

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

最后我找到了答案


Android就是这样设计的。在本例中,视图状态保存/恢复在内部称为片段。因此,在内部实现视图状态保存/恢复的每个视图,例如EditText或android:freezeText=“true”的TextView,都将自动保存并恢复状态。使其显示与上一页完全相同。

这将对您有所帮助@这与我的问题无关。我认为这是真的,但许多安卓开发者并不十分理解。围绕实例状态的方法似乎只引用片段的内部状态(即片段的实例变量),应该保存在
savedInstanceState
包中并从中恢复。但这仅在父活动保存其状态时发生(即,在配置更改时,例如,将活动放在后台或设备旋转时)。当一个片段被备份时,实例(包括其状态)只保留需要恢复的视图。