在我看来,Android Fragments 演示中一定有一个错误。
作为背景,片段显然有时由 Android 操作系统实例化,因此需要一个公共的无参数构造函数:
Fragment 的所有子类都必须包含一个公共的空构造函数。框架通常会在需要时重新实例化一个片段类,特别是在状态恢复期间,并且需要能够找到这个构造函数来实例化它。如果空构造函数不可用,在状态恢复过程中某些情况下会出现运行时异常。
但是来自官方 Android 培训 Fragments的NewsReader 演示HeadlinesFragment
构建了该类并使用setOnHeadlineSelectedListener(this)
from对其进行配置NewsReaderActivity.onCreate()
。
如果 Android 操作系统重新实例化此片段,则该mHeadlineSelectedListener
字段将为 null,因为HeadlinesFragment
不保存或恢复其状态。无论如何它不能,因为我相信不可能持久引用Activity
.
此外,我注意到Fragment
文档指出:
强烈建议子类不要有其他带参数的构造函数,因为片段重新实例化时不会调用这些构造函数;相反,参数可以由调用者使用 setArguments(Bundle) 提供,然后由 Fragment 使用 getArguments() 检索。
另一方面,在前面的FragmentBasics
示例中,它们似乎正确地执行了实例化和配置(排序)。我说“有点”是因为出于某种原因,它们直接实例化了HeadlinesFragment
而不是 via SupportFragmentManager
,就像在NewsReader
演示中所做的那样。无论如何,他们不会犯从 调用 setter 的明显错误HeadlinesFragment
,MainActivity
而是让HeadlinesFragment
负责在OnArticleSelectedListener
期间找到它的地方onAttach()
。
这是NewsReader
示例中的错误还是我遗漏了什么?与此同时,我提交了一个Android 文档问题。