Android FragmentTab 宿主和 Fragments 内的 Fragments

2023-12-22

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

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

所以我有几个问题:

  1. 上述是正确的方法吗?
  2. 如果没有,我应该怎么做?
  3. 不管怎样,保存实例状态如何与所有这些联系起来,以便我在切换选项卡时不会丢失视图状态?

我不知道如何在 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(使用前将#替换为@)

Android FragmentTab 宿主和 Fragments 内的 Fragments 的相关文章

随机推荐

  • 如何检测 Flutter 布局中的方向变化?

    如何确定 Flutter 中的 Orientation 是纵向还是横向 if portrait return ListView builder else return GridView count 为了确定屏幕的方向 我们可以使用Orien
  • 有没有在 C/C++ 代码中使用 mbind 的示例?

    我正在尝试使用mbind http man7 org linux man pages man2 mbind 2 html在我的 C 代码中 为了跨 4 个 NUMA 域重新排列虚拟页面 不幸的是我是这个函数的新手 long mbind vo
  • 让 Devise 在注册时创建子域

    我想让 Devise 在我的网站上创建子域 现在 我有两个模型 公司 ACompany可以直接在网站上注册 登录后可以邀请其员工 当公司注册时 我希望创建一个唯一的子域 例如 example com gt techcraz example
  • 在软件中测试网络中断

    我在 Windows 中有一个网络 C 程序 我想在不同时间测试网络断开情况 我有什么选择 目前我是 实际上从我的计算机背面断开网络线 使用 ipconfig release 使用cports http www nirsoft net ut
  • 如何在 macbook pro 中运行 docker 时启用虚拟化功能

    I want to run docker in my macbook pro but an error come to my eyes Firstly I think my cpu don t have the virtualization
  • 继承还是组合:依赖“is-a”和“has-a”?

    当我设计类并且必须在继承和组合之间进行选择时 我通常使用经验法则 如果关系是 is a 使用继承 如果关系是 has a 使用组合 总是对的吗 谢谢 不 是 并不总是导致继承 一个经常被引用的例子是正方形和长方形之间的关系 正方形是矩形 但
  • 计算内部有循环的递归函数的时间复杂度

    我正在研究一个简单的问题 我想出了一个 C 递归函数 下面是我的函数 void test int arr int n int x 0 cout lt
  • 圆角的QDialog有黑角而不是半透明

    我需要创建一个QDialog https doc qt io qt 5 qdialog html带有半透明的圆角 问题是这样做时 角是半透明的 但以某种方式被窗口的 alpha 属性填充 使其变黑 这是我对问题原因的理解 清晰可见的是圆形边
  • belongs_to 关联上的 :conditions 的目的是什么?

    假设我与附加条件有以下关联 belongs to admin user class name gt User foreign key gt admin user id conditions gt users admin TRUE or an
  • javascript element.scrollLeft 不工作

    我正在尝试使用滑块 我希望能够滚动到滑块的特定位置 从 MDN 文档看来 我可以使用 element scrollLeft 滚动到特定位置 虽然我似乎不为我工作 var container document getElementById c
  • Oracle 11G 中的限制/偏移

    我正在尝试更新 Oracle 中的表 但遇到了一些困难 我正在从 MySQL 移植代码 但 Oracle 不支持 MySQL 允许的一些命令 这是 MySQL 代码 update table1 t1 set c5 select Contra
  • 在同一文件中找不到类[重复]

    这个问题在这里已经有答案了 可能的重复 稍后在同一文件中定义的派生类 不存在 https stackoverflow com questions 12617188 derived class defined later in the sam
  • 是否有一个Matlab条件IF运算符可以像VBA的IIF一样放置在INLINE中

    在 VBA 中我可以执行以下操作 A B IIF C gt 0 C 0 所以如果 C gt 0 我得到A B C和 CA B 是否有一个运算符或函数可以让我执行这些条件inline在 MATLAB 代码中 简单地利用 MATLAB 在操作需
  • 使用 Twisted Python 的 SMTP 模块清理资源

    这与之前回答的问题有关 使用 Twisted 记录 SMTP 连接 https stackoverflow com questions 12164557 logging smtp connections with twisted 我有一个在
  • 调用“pip install”时运行自定义任务

    我想让我的 python 包 pip installable 问题是该包具有必须源自用户的 init shell 脚本的 shell 脚本 例如 bashrc 但安装后 用户并不确切知道脚本去了哪里 大概是 usr bin 但我们不能保证
  • rubyracer 或 libv8 在 Rails 应用程序中的用途是什么?

    我当时正在做一个项目 经常遇到 therubyracer 和 libv8 的问题 所以我决定删除它们 似乎唯一使用它们作为依赖项的是 less rails 无论如何我都想删除它 我的主要问题是它们的用途是什么 我在普通应用程序中是否需要它们
  • 拆分 BigIntegers 数字

    我正在尝试分割一个大整数的数字 让我说得更具体一些 我正在使用斐波那契序列生成一个大整数 现在使用这个算法我需要循环 直到找到一个 BigInteger 其中前 9 位数字和最后 9 位数字是泛数字 唯一的问题是我必须循环的数量是 300K
  • 对从 Ansible Tower (awx) 执行的 fetch_module 进行故障排除

    我正在尝试从远程主机执行一个非常简单的获取文件 不知怎的 我从来没有让它发挥作用 从远程 Linux 机器获取到 Ansible Tower awx 主机 也是 Linux 机器 这是 Ansible 代码 name get new pri
  • 活动 onCreate 中的 java.util.ConcurrentModificationException

    在最近的一个版本中 我通过 Admob 广告中介添加了 MoPub 我在崩溃日志中看到了一堆 ConcurrentModificationException 这一切似乎都是本机代码 我使用的是所有广告相关和 google android 相
  • Android FragmentTab 宿主和 Fragments 内的 Fragments

    我有一个具有如下层次结构的应用程序 FragmentTabHost Main Activity Fragment tab 1 content splitter view Fragment lhs list Framment rhs cont