大部分代码直接取自Android关于Fragments和DialogFragments的文档。
我有一个 Activity ,引用了一个 fragment 。该 fragment 创建并显示一个 DialogFragment,它接收编辑文本并在提交到 Activity 时回调(通过监听器);然后该 Activity 更新原始 fragment 上的标签。
这在初次启动时按预期工作; fragment 的标签按预期更改。然而,方向改变后,原始 fragment 的 getView() 或 getActivity() 均为 null;方向更改后您无法更改标签。
Android Studio 项目显示此问题;请随意检查并运行它:https://github.com/werelord/testFragment
快速浏览:
重现问题的步骤:
- 启动应用
- 单击按钮显示对话框;设置文本,单击“确定”:标签已正确更新
- 将显示屏旋转为横向,或横向然后返回纵向
- 单击按钮显示对话框;设置文本;由于 getView() 为空,标签未更新。
请注意,我并不是试图让对话框 fragment 处理方向变化;方向更改发生在创建对话框之前。 Activity 和 fragment 在方向变化时重新创建得很好;警报对话框在创建时会获取对正确 Activity 的正确引用(方向更改后重新创建),并且该 Activity 中引用的 fragment 是正确的引用;只是它的所有 View 都是空的。
一个有效的解决方案显然是设置 android 配置更改(“orientation|screenSize|keyboardHidden”),但我想尽可能避免该解决方案。
我觉得很奇怪,它在初始应用程序上运行良好,这让我相信某个地方的引用被破坏并重新创建了;但通过我的所有调试,MainActivity 和 TestFragment 引用是正确的(重新创建的引用)。
我在这里查看了有关 SO 的各种问题,但没有找到任何可以解决我所看到的问题的内容。我在这里缺少什么?
最佳答案
问题是,在旋转更改之后,FragmentStatePagerAdapter
正在内部为您重新创建 TestFragment
。未调用 SectionsPagerAdapter
的 getItem(...)
方法。
这意味着您在 testFragment
变量中引用的 Fragment
实际上并不是正在显示的 fragment 。它永远不会附加到 Activity ,并且它的布局永远不会膨胀,因此在其上调用 setLabelText
将抛出 NullPointerException
。
要解决此问题,您可以完全停止使用 ViewPager
,因为您只有一个 Fragment
。然后,您可以使用 FragmentManager
添加 Fragment
并在方向更改后通过 id 或标签正确查找它。
如果您计划最终使用更多 fragment ,那么您将必须使用 this post 中的解决方法之一在方向更改后从 SectionsPagerAdapter
中获取当前 fragment 。
关于java - 使用 FragmentStatePagerAdapter 更改方向后, fragment View 为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35468133/