大部分代码均来自Android&Fragments&amp ;;的文档。 DialogFragments直接。
我有一个活动,参考片段。这个片段创建并显示一个DialogFragment,它接收一个编辑文本并回调提交给Activity(通过监听器);然后,活动更新原始片段上的标签。
这在初次发布时按预期工作;片段的标签按预期更改。但是在方向改变之后,原始片段的getView()或getActivity()都是null;在更改方向后,您无法更改标签。
Android Studio项目显示此问题;随意查看并运行:https://github.com/werelord/testFragment
快速浏览:
重新创建问题的步骤:
请注意,我并没有尝试让对话框片段处理方向更改;方向更改在创建对话框之前发生。在方向改变时,活动和片段被重建得很好;警报对话框在创建时,正在获取正确的活动参考(在方向更改后重新创建),并且该活动中引用的片段是正确的引用;只是它的所有观点都是空的。
一个有效的解决方案显然是设置android配置更改(" orientation | screenSize | keyboardHidden"),但我想尽可能避免使用该解决方案。
我觉得奇怪的是它在初始应用程序上工作正常,这让我相信某个地方的引用被破坏并重新创建;但是通过我的所有调试,MainActivity和TestFragment引用都是正确的(重新创建的引用)。
我已经在这里查看过各种各样的问题,但是没有找到任何可以解决我所看到问题的问题。我在这里缺少什么?
答案 0 :(得分:2)
问题在于轮换更改后,FragmentStatePagerAdapter
会在内部为您重新创建TestFragment
。 <{1}}的{{1}}方法未被调用。
这意味着您在getItem(...)
变量中引用的SectionsPagerAdapter
实际上并不是显示的Fragment
。它永远不会附加到某个活动,并且它的布局永远不会膨胀,因此在其上调用testFragment
会抛出一个setLabelText
。
要解决此问题,您可以完全停止使用NullPointerException
,因为您只有一个ViewPager
。然后,您可以处理添加Fragment
并使用Fragment
在方向更改后通过ID或标记正确查找。
如果您计划最终使用更多片段,则必须使用this post中的一种解决方法,在方向更改后从FragmentManager
获取当前片段。