我的应用程序的主页有一个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;
}