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