gpt4 book ai didi

java - 使用 FragmentStatePagerAdapter 更改方向后 fragment View 为空

转载 作者:可可西里 更新时间:2023-11-01 11:42:57 24 4
gpt4 key购买 nike

大部分代码直接取自 Android 关于 Fragments 和 DialogFragments 的文档。

我有一个 Activity ,引用了一个 fragment 。此 fragment 创建并显示一个 DialogFragment,它接收编辑文本并在提交到 Activity 时回调(通过监听器);该 Activity 随后会更新原始 fragment 上的标签。

这在初始启动时按预期工作; fragment 的标签按预期更改。但是在方向改变之后,原始 fragment 的 getView() 或 getActivity() 都是空的;您无法在方向更改后更改标签。

显示此问题的 Android Studio 项目;随时检查并试一试:https://github.com/werelord/testFragment

快速浏览:

重现问题的步骤:

  1. 启动应用
  2. 点击按钮显示对话框;设置文本,点击确定:标签已正确更新
  3. 将显示旋转到横向或横向,然后再旋转回纵向
  4. 点击按钮显示对话框;设置文本;由于 getView() 为空,标签未更新。

请注意,我并不是要让对话框 fragment 处理方向更改;方向更改发生在对话框创建之前。 Activity 和 fragment 在方向改变时重新创建得很好;警报对话框在创建时获得对正确 Activity 的正确引用(在方向更改后重新创建),并且该 Activity 中引用的 fragment 是正确的引用;只是它的所有 View 都是空的。

一个可行的解决方案显然是设置 android 配置更改(“orientation|screenSize|keyboardHidden”),但我想尽可能避免使用该解决方案。

我觉得很奇怪,它在初始应用程序上运行良好,这让我相信某处的引用已被破坏并重新创建;但是通过我的所有调试,MainActivity 和 TestFragment 引用是正确的(重新创建的引用)。

我在这里查看了关于 SO 的各种问题,但没有找到任何可以解决我所看到的问题的方法。我在这里缺少什么?

最佳答案

问题是,在旋转更改后,FragmentStatePagerAdapter 会在内部为您重新创建 TestFragment。未调用 SectionsPagerAdaptergetItem(...) 方法。

这意味着您在 testFragment 变量中引用的 Fragment 实际上并不是显示的那个。它从不附加到 Activity ,它的布局从不膨胀,因此调用 setLabelText 将抛出 NullPointerException

要解决此问题,您可以完全停止使用 ViewPager,因为您只有一个 Fragment。然后,您可以处理添加 Fragment 并在方向更改后使用 FragmentManager 通过 id 或标签正确查找它。

如果您计划最终使用更多 fragment ,那么您将不得不使用 this post 中的解决方法之一。在方向更改后从 SectionsPagerAdapter 中获取当前 fragment 。

关于java - 使用 FragmentStatePagerAdapter 更改方向后 fragment View 为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35468133/

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