Android FragmentTab主机和片段内的片段

Bra*_*son 6 android xamarin.android android-tabhost android-fragments android-nested-fragment

我有一个像这样的层次结构的app:

FragmentTabHost (Main Activity)
  - Fragment (tab 1 content - splitter view)
    - Fragment (lhs, list)
    - Framment (rhs, content view)
  - Fragment (tab 2 content)
  - Fragment (tab 2 content)
Run Code Online (Sandbox Code Playgroud)

所有片段视图都从资源中膨胀.

当应用程序启动时,一切都会显示,看起来很 当我从第一个选项卡切换到另一个选项卡并再次返回时,我试图重新创建选项卡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();
}
Run Code Online (Sandbox Code Playgroud)

所以我有几个问题:

  1. 以上是正确的方法吗?
  2. 如果没有,我应该怎么做?
  3. 无论哪种方式,保存实例状态如何与所有这些相关联,以便在切换选项卡时不会丢失视图状态?

Str*_*ton 3

我不确定如何在 Mono 中执行此操作,但是要将子片段添加到另一个片段,您不能FragmentManager使用Activity. 相反,您必须使用ChildFragmentManager托管Fragment

http://developer.android.com/reference/android/app/Fragment.html#getChildFragmentManager() http://developer.android.com/reference/android/support/v4/app/Fragment.html#getChildFragmentManager()

主要FragmentManager处理Activity您的选项卡。
ofChildFragmentManager处理tab1分割视图。