我有一个具有如下层次结构的应用程序:
FragmentTabHost (Main Activity)
- Fragment (tab 1 content - splitter view)
- Fragment (lhs, list)
- Framment (rhs, content view)
- Fragment (tab 2 content)
- Fragment (tab 2 content)
所有片段视图都因资源而膨胀。
当应用程序启动时,一切都会显示出来并且看起来很好。当我从第一个选项卡切换到另一个选项卡并再次切换回来时,我在尝试重新创建选项卡 1 的视图时遇到膨胀异常。
深入挖掘一下,这就是正在发生的事情:
- 第一次加载时,膨胀分割视图会导致其两个子片段被添加到片段管理器中。
- 从第一个选项卡切换时,它的视图被销毁,但它的子片段保留在片段管理器中
- 切换回第一个选项卡时,视图会重新膨胀,并且由于旧的子片段仍在片段管理器中,因此在实例化新的子片段时(通过膨胀)会引发异常
我已经通过从片段管理器中删除子片段(我使用 Mono)来解决这个问题,现在我可以毫无例外地切换选项卡。
public override void OnDestroyView()
{
var ft = FragmentManager.BeginTransaction();
ft.Remove(FragmentManager.FindFragmentById(Resource.Id.ListFragment));
ft.Remove(FragmentManager.FindFragmentById(Resource.Id.ContentFragment));
ft.Commit();
base.OnDestroyView();
}
所以我有几个问题:
- 上述是正确的方法吗?
- 如果没有,我应该怎么做?
- 不管怎样,保存实例状态如何与所有这些联系起来,以便我在切换选项卡时不会丢失视图状态?
我不知道如何在 Mono 中执行此操作,但是要将子片段添加到另一个片段,您不能使用FragmentManager
of the Activity
。相反,您必须使用ChildFragmentManager
托管的Fragment
:
http://developer.android.com/reference/android/app/Fragment.html#getChildFragmentManager() http://developer.android.com/reference/android/app/Fragment.html#getChildFragmentManager()
http://developer.android.com/reference/android/support/v4/app/Fragment.html#getChildFragmentManager() http://developer.android.com/reference/android/support/v4/app/Fragment.html#getChildFragmentManager()
主要的FragmentManager
of the Activity
处理您的选项卡。
The ChildFragmentManager
of tab1
处理分割视图。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)