【问题标题】:Purpose of FrameLayout?框架布局的目的?
【发布时间】:2020-01-28 22:26:47
【问题描述】:

我为FrameLayout 找到的所有示例都使用FrameLayout 将多个子级堆叠在一起。甚至例如* 回答 here

您使用 FrameLayout 将子视图堆叠在一起,

official documentation 然而声明

FrameLayout 的设计目的是在屏幕上屏蔽一个区域以显示一个单个项目。一般应该用FrameLayout来保存单个子视图

虽然可以向其中添加多个孩子,但这听起来只是一个副作用。

那么,带有 单个 项的 FrameLayout 的最初预期用例是什么?有人有这方面的例子吗?

【问题讨论】:

  • 这是最简单的布局,它仅根据其大小和重力布置每个子视图,而忽略其他子视图,从而产生视图堆叠在顶部的效果。
  • Elias,我在链接的主题中找不到一个带有 SINGLE 孩子的示例):Pawel,谢谢我知道这一点,但想知道一个孩子的用例是什么。

标签: android android-framelayout


【解决方案1】:

FrameLayout 只有一个孩子有不同的用途。想象一下,有一个加载微调器应该居中但不填满整个页面,而且您希望在显示加载微调器时隐藏内容。可能的解决方案:FrameLayoutmatch_parent 用于宽度和高度以及背景颜色,ProgressBar(加载微调器)与 android:layout_gravity=center 作为 FrameLayout 的唯一子项。所以现在你可以设置FrameLayoutandroid:visibility来显示或隐藏整个东西。

【讨论】:

  • hmm 但是我如何将带有微调器的框架布局放置在内容布局的顶部,例如一个线性布局?
  • 父组件需要是一个支持它的视图,因此例如,您也可以使用 FrameLayout,然后将您的真实内容嵌入到作为 FrameLayout 的直接子元素的 LinearLayout 中,并使用完整的宽度。但您也可以使用 ConstraintLayout。这里有很多可能性......
  • 所以你的意思是 FrameLayoutA -> LinearLayout (for content) | FrameLayoutB(用于微调器)。在这种情况下 FrameLayoutA 必须有孩子,但我关心 FrameLayouts 的示例与一个孩子。 FrameLayoutB 只有一个孩子(微调器),但我认为没有必要为微调器使用 FrameLayoutB - 难道这也只是例如线性布局?所以对于只有一个孩子的 FrameLayout 仍然没有真正的用例,而文档似乎指出这(只有一个孩子)是 FrameLayout 的预期用例?
  • Afaik 在 LinearLayout 中只有一个子级然后将其居中定位不是 LinearLayout 的假定功能。我不知道它是否对性能有很大影响,但是如果您考虑在具有全宽和全高的 LinearLayout 中放置一个孩子,然后让孩子居中,您最好使用 FrameLayout。