【发布时间】:2017-08-10 06:10:26
【问题描述】:
考虑一个带有片段MainFragment 的活动MainActivity。该片段有一些复杂的布局层次结构和一个视图组Frame,它来自一个库com.framer:frame_me:1.1。
如果我有两种风格 foo 和 bar,并且我希望这个 Frame 只存在于 bar 风格中而不是 foo 中,则 XML 元素 java 代码 和依赖项。我该怎么做?
我可以使用编译依赖项
barCompile 'com.framer:frame_me:1.1'
但是片段和它的 XML 呢?我不想为两种风格的片段编写 2 个变体,因为我不想在 2 个地方维护相同的代码。
我脑海中的一个可能的想法(可能是一个糟糕的想法)是这样的:
- 将 XML 元素移动到
bar源集中的单独文件中。在foo源集中添加ViewStub元素,同名。现在使用include在片段 XML 中包含此 XML 文件 - 添加一个接口来处理
main源集中的Frame视图。在foo源集中添加一个空实现,在bar源集中添加一个。这样,所有逻辑都可以保留在bar中,而所有常见逻辑都保留在main源集中。
仅仅为了编写特定于风味的代码和 xml,这一切听起来都需要大量的工作。
【问题讨论】:
-
为什么不为 Frame 扩展一个视图,在 main.xml 中有这个视图,但是 GONE 并且只有在运行风味时才启用它?您可以在 View 的新子类中拥有一个额外的 xml
-
barCompile!Frame甚至不存在于foo风格中,这将引发错误。还是我没有正确理解您的评论? -
你的xml也需要依赖吗?
-
是的,
Frame类存在依赖关系。我无法在不存在的 xml 中添加视图。 -
您可以在主 xml 中为 Frame 使用容器 ViewGroup 子类。但它仍然倾向于您提出的解决方案。您将必须实现此 ViewGroup 子类两次,每种风格一次。