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

标签 java android android-layout android-fragments

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

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

这在初次启动时按预期工作; fragment 的标签按预期更改。然而,方向改变后,原始 fragment 的 getView() 或 getActivity() 均为 null;方向更改后您无法更改标签。

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 实际上并不是正在显示的 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/

相关文章:

android - air-adb : Error "Cannot run program "bash. exe": CreateProcess error=2, 系统找不到指定的文件)

android - Android 应用程序中的 JPEG 硬件解码支持

android - ActionMode Bar 的所有图标都没有在 Android 中显示?

java - 布局更改可见性

java - Hibernate的SessionFactory是在每个DAO中还是只在扩展类中?

java - 启动 Liferay 7 (liferay-portal-7.0-ce-ga1) 时出错 : PWC6345: There is an error in invoking javac. 需要完整的 JDK(不仅仅是 JRE)

android InputMethodService.onKey 和 OnKeyboardActionListener.onkeydown 之间有什么不同

java - 一种布局中图像的最大尺寸是多少?

java - Spring Cloud配置客户端启动后立即关闭

java - j2me - 比较 2 个日期