为什么布局参数在Android编程中有效?

问题描述 投票:7回答:4

首先是我的背景:我是刚接触Ruby的Java新手。如果这有帮助。

我对布局参数如何工作感到困惑。我正在关注创建Android应用程序的基本Hello World简介。第1步,扩展Activity类,使用onCreate()方法访问XML布局。好的,我明白了。

然后我在Main.XML中创建一个布局(比如RelativeLayout)。所以这是利用了扩展ViewGroup类的RelativeLayout类,到目前为止还可以。然后让我说我在里面创建一个按钮。这是我的问题开始的地方。如果我查看我正在关注的示例,我会看到属性分配给属于RelativeLayout类的按钮(即:android:layout_alignParentRight =“true”)。这些似乎是布局参数。但为什么这有效呢?按钮类似乎继承自View类。为什么按钮对象可以接受RelativeLayout对象的属性?也许我的Ruby编程让我很困惑..

谢谢!

更新:为了后人:感谢Slothsberry指出XML Layouts链接,它似乎在“属性”和“布局参数”部分的2部分中清楚地描述了答案。属性部分如下:

每个View和ViewGroup对象都支持各种XML属性。某些属性特定于View对象(例如,TextView支持textSize属性),但这些属性也可由任何可扩展此类的View对象继承。有些对于所有View对象都是通用的,因为它们是从根View类继承的(就像id属性一样)。并且,其他属性被视为“布局参数”,它们是描述View对象的某些布局方向的属性,由该对象的父ViewGroup对象定义。

布局参数部分可能是真正回答这个问题的部分。它声明:

每个ViewGroup类都实现一个扩展ViewGroup.LayoutParams的嵌套类。此子类包含定义每个子视图的大小和位置的属性类型,适用于视图组。如图1所示,父视图组定义了每个子视图(包括子视图组)的布局参数。

他们也提供了一个很好的图表。似乎初学程序员需要认识到,在引用Java类时,XML更像是一个CSS表,并且在计算并将其转移到Java类对应项之前,首先以嵌套方式计算属性。这是我目前的理解反正:)

java android android-layout
4个回答
6
投票

布局参数不严格镜像对象继承(正如您所注意到的)。原因是布局有两个部分:配置视图,并使用该视图作为参数参数化视图的父级。

因此,如果父布局不是RelativeLayout,那么像android:layout_below这样的参数将被忽略。从OOP的角度来看,将该参数放在RelativeLayout对象中可能是有意义的。但这就是你在java代码中的表现。

在XML代码中,它采用的方式是关于子项的信息包含在子项中。布局膨胀时,将忽略需要父项不存在的布局参数。它是一个很好的系统,用于使XML更具可读性和可移植性。并不是严格意义上的类包结构,而是人们考虑将事物放置在布局中的直观方式。


3
投票

android中的所有布局元素都继承自View,尽管间接许多。

通用View类具有适用于任何可见布局元素的属性(属性)。对于根布局,系统会设置一些属性,例如布局重力,布局尺寸等(在大多数情况下,我相信)。

如果我的根布局是一些线性布局,Android将允许我将相对布局作为根中的子项。 Android将允许我在嵌套元素上设置各种布局属性,以便控制它的渲染方式。对于Button和任何其他Android布局,这都是相同的。

如果您不关心特定属性,请不要设置它。它们存在以允许您控制应用程序的屏幕。查看XML LayoutsHello Views,了解详细信息。


1
投票

你有点困惑,布局参数不拥有特定的XML对象。如果您将其放在一个子XML XXXView或XXXLAyout中,它将理解其右侧必须与父权限位于同一位置。

然后,如果您没有为该子项创建布局参数,则子项将尝试继承其父项的布局参数。


0
投票

Layout

布局是两个过程:度量过程和布局过程。测量过程在measure(int, int)中实现,并且是视图树的自上而下遍历。在递归期间,每个视图都会在树中向下推送维度规范。在测量过程结束时,每个视图都存储了测量值。第二次传球发生在layout(int, int, int, int),也是自上而下的。在此过程中,每个父级负责使用度量过程中计算的大小来定位其所有子项。

当视图的measure()方法返回时,必须设置其getMeasuredWidth()getMeasuredHeight()值,以及该视图的所有后代的值。视图的测量宽度和测量高度值必须遵守视图父项施加的约束。这保证了在测量通过结束时,所有父母都接受他们孩子的所有测量。父视图可以在其子项上多次调用measure()。例如,父母可以用未指定的维度测量每个孩子一次以找出他们想要的大小,然后如果所有孩子的无约束大小的总和太大或太小,则用实际数字再次对他们调用measure()。

度量过程使用两个类来传达维度。视图使用View.MeasureSpec类告诉他们的父母他们想要如何测量和定位。基本的LayoutParams类只描述了视图对宽度和高度的要求。对于每个维度,它可以指定以下之一:

  • 一个确切的数字
  • MATCH_PARENT,这意味着视图要与其父级一样大(减去填充)
  • WRAP_CONTENT,这意味着视图要足够大以包含其内容(加上填充)。

LayoutGroup的不同子类有LayoutParams的子类。例如,AbsoluteLayout有自己的LayoutParams子类,它添加了X和Y值。

MeasureSpecs用于将需求从父级推送到子级。 MeasureSpec可以采用以下三种模式之一:

  • 缺陷:父母使用它来确定子视图的所需维度。例如,LinearLayout可以在其​​子节点上调用measure(),其高度设置为UNSPECIFIED,宽度为240,以找出子视图在宽度为240像素时的高度。
  • 确切地说:父母使用它来对孩子施加确切的大小。孩子必须使用这个尺寸,并保证其所有后代都符合这个尺寸。
  • AT_MOST:父母用它来强加孩子的最大尺寸。孩子必须保证它和它的所有后代都适合这个尺寸。

要启动布局,请调用requestLayout()。当该方法认为它不再适合其当前边界时,该方法通常由视图自身调用。

© www.soinside.com 2019 - 2024. All rights reserved.