gpt4 book ai didi

Android FragmentTab 主机和 Fragments 内的 Fragments

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:00:58 25 4
gpt4 key购买 nike

我有一个层次结构如下的应用:

FragmentTabHost (Main Activity)
- Fragment (tab 1 content - splitter view)
- Fragment (lhs, list)
- Framment (rhs, content view)
- Fragment (tab 2 content)
- Fragment (tab 2 content)

所有 fragment View 都从资源中膨胀。

当应用程序启动时,一切都会出现并且看起来很好。当我从第一个选项卡切换到另一个选项卡并再次返回时,我遇到膨胀异常试图重新创建选项卡 1 的 View 。

再深入一点,这就是正在发生的事情:

  • 在第一次加载时,展开 Split View会导致其两个子 fragment 被添加到 fragment 管理器中。
  • 在离开第一个选项卡时,它的 View 被销毁,但它的子 fragment 留在 fragment 管理器中
  • 切换回第一个选项卡时, View 会重新膨胀,并且由于旧的子 fragment 仍在 fragment 管理器中,因此在实例化新的子 fragment (通过膨胀)时会抛出异常

我已经通过从 fragment 管理器中删除子 fragment 来解决这个问题(我使用的是 Mono),现在我可以毫无异常(exception)地切换选项卡。

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

所以我有几个问题:

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

最佳答案

我不确定如何在 Mono 中执行此操作,但是要将子 fragment 添加到另一个 fragment ,您不能使用 ActivityFragmentManager。相反,您必须使用托管 FragmentChildFragmentManager:

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

Activity 的主要 FragmentManager 处理您的标签。
tab1ChildFragmentManager 处理 Split View。

关于Android FragmentTab 主机和 Fragments 内的 Fragments,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15349838/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com