使用FragmentStatePagerAdapter

时间:2016-02-17 21:28:20

标签: java android android-layout android-fragments

大部分代码均来自Android&Fragments&amp ;;的文档。 DialogFragments直接。

我有一个活动,参考片段。这个片段创建并显示一个DialogFragment,它接收一个编辑文本并回调提交给Activity(通过监听器);然后,活动更新原始片段上的标签。

这在初次发布时按预期工作;片段的标签按预期更改。但是在方向改变之后,原始片段的getView()或getActivity()都是null;在更改方向后,您无法更改标签。

Android Studio项目显示此问题;随意查看并运行:https://github.com/werelord/testFragment

快速浏览:

重新创建问题的步骤:

  1. 启动应用
  2. 点击按钮显示对话框;设置文本,单击确定:标签正确更新
  3. 将显示旋转为横向或横向,然后再回到纵向
  4. 点击按钮显示对话框;设置文字;由于getView()为null,标签不会更新。
  5. 请注意,我并没有尝试让对话框片段处理方向更改;方向更改在创建对话框之前发生。在方向改变时,活动和片段被重建得很好;警报对话框在创建时,正在获取正确的活动参考(在方向更改后重新创建),并且该活动中引用的片段是正确的引用;只是它的所有观点都是空的。

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

    我觉得奇怪的是它在初始应用程序上工作正常,这让我相信某个地方的引用被破坏并重新创建;但是通过我的所有调试,MainActivity和TestFragment引用都是正确的(重新创建的引用)。

    我已经在这里查看过各种各样的问题,但是没有找到任何可以解决我所看到问题的问题。我在这里缺少什么?

1 个答案:

答案 0 :(得分:2)

问题在于轮换更改后,FragmentStatePagerAdapter会在内部为您重新创建TestFragment。 <{1}}的{​​{1}}方法未被调用。

这意味着您在getItem(...)变量中引用的SectionsPagerAdapter实际上并不是显示的Fragment。它永远不会附加到某个活动,并且它的布局永远不会膨胀,因此在其上调用testFragment会抛出一个setLabelText

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

如果您计划最终使用更多片段,则必须使用this post中的一种解决方法,在方向更改后从FragmentManager获取当前片段。