为什么片段在使用FrameLayout的片段事务时调用OnCreate / OnCreateView?

时间:2017-01-19 15:32:46

标签: android android-fragments xamarin.android

我的应用程序的主页有一个FrameLayout。

我在活动开始时实例化两个片段,并且我尝试使用菜单按钮在片段之间进行交换。

scanHistoryFrag = new HistoryFragment();
scanFrag = new ScanFragment();

我从不替换这些对象 - 我在应用程序的整个生命周期中使用相同的对象。但是,当我在FrameLayout中交换它们时......

private void ChangeFragment(Android.Support.V4.App.Fragment fragment)
{
    Android.Support.V4.App.FragmentTransaction ft = SupportFragmentManager.BeginTransaction();
    ft.Replace(Resource.Id.fragmentContainer, fragment);
    ft.Commit();
}

再次在Fragment上调用OnCreate和OnCreateView ...这意味着我在该片段上创建后所做的任何调整都会再次被初始值覆盖。我似乎无法找到解释为什么会发生这种情况或如何避免这种情况的解释。

OnOptionsItemSelected正在调用ChangeFragment方法,因为我使用菜单按钮来切换它们。

1 个答案:

答案 0 :(得分:3)

  

我从不替换这些对象 - 我在应用程序的整个生命周期中使用相同的对象。

初始化Fragment的子类只是创建此类对象的实例,将调用此类的构造函数,但除非{{1},否则它将不会经历Fragment的生命周期添加了},有关详细信息,请参阅Fragments。为了更容易理解,我个人认为实例保存了此Fragment类的数据状态,但生命周期事件处理此Fragment的视图状态。

  

这意味着我在该片段上创建后所做的任何调整都会再次被初始值覆盖。

是的,你是对的。为避免再次覆盖初始值,我们可以在Fragment中缓存片段的视图,例如:

OnCreateView