为什么片段在将片段事务与 FrameLayout 一起使用时调用 OnCreate / OnCreateView



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

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

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

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

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

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

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

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

初始化一个子类 Fragment 只是创建这个类对象的实例,这个类的构造函数会被调用,但除非添加这个Fragment,否则它不会经历Fragment的生命周期,更多信息可以参考 Fragments。为了更容易理解,我个人认为实例保存了这个Fragment类的数据状态,但是生命周期的事件处理这个Fragment的视图状态。

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

是的,你是对的。为了避免再次用初始值重写,我们可以将片段的视图缓存在OnCreateView中,例如:

private View rootView;
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    // Use this to return your custom view for this Fragment
    // return inflater.Inflate(Resource.Layout.YourFragment, container, false);
    if (rootView == null)
    {
        //first time creating this fragment view
        rootView = inflater.Inflate(Resource.Layout.fragmentlayout1, container, false);
        //Initialization
        //TODO:
    }
    else
    {
        //not first time creating this fragment view
        ViewGroup parent = (ViewGroup)rootView.Parent;
        if (parent != null)
        {
            parent.RemoveView(rootView);
        }
    }
    return rootView;
}

最新更新