Java 为什么布局参数在Android编程中起作用?

Java 为什么布局参数在Android编程中起作用?,java,android,android-layout,Java,Android,Android Layout,首先介绍一下我的背景:我是从Ruby过来的Java新手。如果有帮助的话 我对布局参数的工作原理感到困惑。下面是创建Android应用程序的基本介绍。步骤1,扩展Activity类和onCreate()方法以访问XML布局。好的,我明白了 然后我在Main.XML中创建一个布局(比如RelativeLayout)。这是利用RelativeLayout类来扩展ViewGroup类,到目前为止。然后假设我在这里面创建了一个按钮。这就是我的问题的起点。如果我看一下下面的示例,我会看到属性被分配给属于Re

首先介绍一下我的背景:我是从Ruby过来的Java新手。如果有帮助的话

我对布局参数的工作原理感到困惑。下面是创建Android应用程序的基本介绍。步骤1,扩展Activity类和onCreate()方法以访问XML布局。好的,我明白了

然后我在Main.XML中创建一个布局(比如RelativeLayout)。这是利用RelativeLayout类来扩展ViewGroup类,到目前为止。然后假设我在这里面创建了一个按钮。这就是我的问题的起点。如果我看一下下面的示例,我会看到属性被分配给属于RelativeLayout类的按钮(即:android:layout\u alignParentRight=“true”)。这些似乎是布局参数。但这为什么有效呢?button类似乎继承自View类。为什么按钮对象可以接受RelativeLayout对象的属性?也许我的Ruby编程把我弄糊涂了

谢谢

更新:为了子孙后代:感谢Slothsberry指出链接,它似乎在“属性”和“布局参数”两部分中清楚地描述了答案。属性部分内容如下:

每个视图和视图组对象都支持各自不同的XML 属性。某些属性特定于视图对象(例如 例如,TextView支持textSize属性),但 属性也由任何可能扩展此属性的视图对象继承 班级。有些视图对象是所有视图对象所共有的,因为它们是继承的 从根视图类(如id属性)。以及其他 属性被视为“布局参数”,即属性 描述视图对象的某些布局方向,如 由该对象的父视图组对象定义

布局参数部分也许是真正回答这个问题的部分。其中规定:

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


它们也给出了一个很好的图表。初学者似乎需要认识到,在引用Java类时,XML的行为更像CSS表,属性首先以嵌套方式计算,然后再计算并传递给Java类对应项。这就是我目前的理解:)

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


然后,如果不为该子级创建布局参数,该子级将尝试继承其父级的布局参数。

android中的所有布局元素都是从视图继承的,尽管许多是间接继承的

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

如果我的根布局是线性布局,Android将允许我在根中有一个相对布局作为子级。Android将允许我在嵌套元素上设置各种布局属性,以控制其呈现方式。这对按钮和任何其他Android布局都是一样的


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

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

因此,如果父布局不是RelativeLayout,下面的android:layout_等参数将被忽略。从OOP的角度来看,将该参数放在RelativeLayout对象中可能是有意义的。但在java代码中就是这样做的

在XML代码中,它采用的方法是将有关子对象的信息包含在子对象中。当布局充气时,需要不存在父级的布局参数将被忽略。这是一个很好的系统,android使用它来提高XML的可读性和可移植性。它不是严格地指类包结构,而是指人类在布局中放置东西的直观方式

布局是两个过程:测量过程和布局过程。测量过程在测量(int,int)中实现,是视图树的自顶向下遍历。在递归过程中,每个视图都会将维度规范向下推到树上。在测量过程结束时,每个视图都存储了其测量值。第二个过程发生在布局(int,int,int,int)中,也是自顶向下的。在此过程中,每个父级负责使用测量过程中计算的尺寸定位其所有子级

当视图的measure()方法返回时,必须设置其
getMeasuredWidth()
getMeasuredHeight()
值以及该视图所有子体的值。视图的测量宽度和测量高度值必须遵守视图父视图施加的约束。这保证了在测量结束时,所有家长都接受他们孩子的所有测量。父视图可以对其子视图多次调用measure()。例如,家长可能会用未指定的维度测量每个孩子一次,以了解他们想要多大