首先是我的背景:我是刚接触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类对应项之前,首先以嵌套方式计算属性。这是我目前的理解反正:)
布局参数不严格镜像对象继承(正如您所注意到的)。原因是布局有两个部分:配置视图,并使用该视图作为参数参数化视图的父级。
因此,如果父布局不是RelativeLayout,那么像android:layout_below这样的参数将被忽略。从OOP的角度来看,将该参数放在RelativeLayout对象中可能是有意义的。但这就是你在java代码中的表现。
在XML代码中,它采用的方式是关于子项的信息包含在子项中。布局膨胀时,将忽略需要父项不存在的布局参数。它是一个很好的系统,用于使XML更具可读性和可移植性。并不是严格意义上的类包结构,而是人们考虑将事物放置在布局中的直观方式。
android中的所有布局元素都继承自View,尽管间接许多。
通用View类具有适用于任何可见布局元素的属性(属性)。对于根布局,系统会设置一些属性,例如布局重力,布局尺寸等(在大多数情况下,我相信)。
如果我的根布局是一些线性布局,Android将允许我将相对布局作为根中的子项。 Android将允许我在嵌套元素上设置各种布局属性,以便控制它的渲染方式。对于Button和任何其他Android布局,这都是相同的。
如果您不关心特定属性,请不要设置它。它们存在以允许您控制应用程序的屏幕。查看XML Layouts或Hello Views,了解详细信息。
你有点困惑,布局参数不拥有特定的XML对象。如果您将其放在一个子XML XXXView或XXXLAyout中,它将理解其右侧必须与父权限位于同一位置。
然后,如果您没有为该子项创建布局参数,则子项将尝试继承其父项的布局参数。
布局是两个过程:度量过程和布局过程。测量过程在measure(int, int)
中实现,并且是视图树的自上而下遍历。在递归期间,每个视图都会在树中向下推送维度规范。在测量过程结束时,每个视图都存储了测量值。第二次传球发生在layout(int, int, int, int)
,也是自上而下的。在此过程中,每个父级负责使用度量过程中计算的大小来定位其所有子项。
当视图的measure()方法返回时,必须设置其getMeasuredWidth()
和getMeasuredHeight()
值,以及该视图的所有后代的值。视图的测量宽度和测量高度值必须遵守视图父项施加的约束。这保证了在测量通过结束时,所有父母都接受他们孩子的所有测量。父视图可以在其子项上多次调用measure()。例如,父母可以用未指定的维度测量每个孩子一次以找出他们想要的大小,然后如果所有孩子的无约束大小的总和太大或太小,则用实际数字再次对他们调用measure()。
度量过程使用两个类来传达维度。视图使用View.MeasureSpec
类告诉他们的父母他们想要如何测量和定位。基本的LayoutParams类只描述了视图对宽度和高度的要求。对于每个维度,它可以指定以下之一:
LayoutGroup的不同子类有LayoutParams的子类。例如,AbsoluteLayout有自己的LayoutParams子类,它添加了X和Y值。
MeasureSpecs用于将需求从父级推送到子级。 MeasureSpec可以采用以下三种模式之一:
要启动布局,请调用requestLayout()
。当该方法认为它不再适合其当前边界时,该方法通常由视图自身调用。