2

在我看来,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 的明显错误HeadlinesFragmentMainActivity而是让HeadlinesFragment负责在OnArticleSelectedListener期间找到它的地方onAttach()

这是NewsReader示例中的错误还是我遗漏了什么?与此同时,我提交了一个Android 文档问题

4

0 回答 0