Fragments作为静态内部类与独立公共类背后的设计逻辑是什么?

Abd*_*han 27 java oop android android-fragments

我无法理解我刚刚开始使用的Android软件设计的一个重要方面,从我所知道的Fragment设计已被采用以解耦代码,其中直觉是Activity遗体原样并Fragment可以重复使用其他其中,甚至可能在不同的活动中,或者可能与其他片段一起,在主/细节流或横向UI中.

好吧所以我已经看到了很多关于SO的问题,询问为什么Fragments将其作为静态内部类放在一个内部Activity,答案是如果我们不将它们设置为静态,那么Fragment可能会引用一个类似于活动的引用.屏幕旋转或重新绘制可能会泄漏活动或其他东西.

这让我又回到了起点,我有问题,好吧,如果片段的设计是为了分离代码被采纳,那么我们为什么要嫁给FragmentActivity通过把它里面的活动类,而不是把它们作为独立的公共课?这与碎片的存在完全不矛盾吗?

具有项目结构的缺点是什么?哪个Fragment都是自己独立的一类?鉴于我的Fragment代码可以增长到1000行,特别是在尝试制作动画时,我发现这更加整洁,分离并且可以在除了预期的父Activity之外的活动中重复使用.

  • 我们仍然遭受上述内存泄漏问题吗?
  • 我错过了一些关于设计逻辑的东西吗?请教育我.
  • 有没有一种方法可以将片段保留为内部类并仍在其他地方使用?我可能也会在这里遗漏一些东西......所以请告诉我.

项目结构

任何其他项目设计方法,概念,对我直觉的更正都非常受欢迎,因为我刚开始在这里,我很想知道我的所有选择.

谢谢 :)

laa*_*lto 24

这让我回到原点,我有一个问题,那就是,如果为了解耦代码而采用Fragment设计,那么为什么我们将Fragment与Activity放在一起,将它放在Activity类中而不是放入他们作为独立的公共课程?这与碎片的存在完全不矛盾吗?

片段的主要驱动因素不是解耦而是组合:可重用的用户界面片段,可以在不同的配置中轻松组合在一起.从可组合性来看,模块化和它的解耦是的,解耦是存在的,但它不是主要关注点.

继续阅读片段设计理念.

模块化硬币有另一面:如果两个东西属于一起,例如活动和仅与该活动一起使用的片段,它们最好保持在一起,而不是遍布整个代码库,因此它们更容易一起发展.像你的问题中的项目结构,活动和片段在不同的包中并不真正遵循这个原则.

将片段保存在单独的类中但接近相关活动的一种常见方法是使用命名前缀,以便它们在同一个包中的字母列表中排序:例如FooActivity with FooDetailsFragment.

对于没有那么多代码且片段仅用于一个活动的简单片段,将它们作为该活动中的静态内部类完全没问题.

只是尝试保持一致,以便阅读代码的其他人可以轻松地在代码库中找到自己的方式,并且WTF /分钟代码度量保持较低.

我们仍然遭受上述内存泄漏问题吗?

不,泄漏仅适用于持有外部类引用的非静态内部类.包级别类没有任何外部类来持有引用.

由于片段共享托管活动的生命周期,因此泄漏外部对象并不是片段的关注点.只是框架需要能够在没有任何外部类对象的情况下实例化片段,并且static是此要求.

有没有一种方法可以将片段保留为内部类并仍在其他地方使用?我可能也会在这里遗漏一些东西......所以请告诉我.

您可以Outer.Inner在代码中Outer$Inner使用点表示法或使用反射(例如XML文件)引用公共内部类.

虽然这在技术上是可行的,但这样做表示你依赖于一个类的内部,这是一种设计气味.我真的在外部类代码本身中引用内部类.

  • 感谢您抽出时间回答我,我真的发现你如何分解我的问题的每一部分.我问这个的一个显而易见的原因是因为Android Studio默认创建我的所有片段和静态内部类...我不想在不知道我在做什么的情况下超越默认值.根据您的解释,我认为Android Studio假设Fragment仅用于该特定Activity. (2认同)