有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

首先,我的背景是:我刚从Ruby来到Java。如果有帮助的话

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

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

谢谢

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

Every View and ViewGroup object supports their own variety of XML attributes. Some attributes are specific to a View object (for example, TextView supports the textSize attribute), but these attributes are also inherited by any View objects that may extend this class. Some are common to all View objects, because they are inherited from the root View class (like the id attribute). And, other attributes are considered "layout parameters," which are attributes that describe certain layout orientations of the View object, as defined by that object's parent ViewGroup object.

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

Every ViewGroup class implements a nested class that extends ViewGroup.LayoutParams. This subclass contains property types that define the size and position for each child view, as appropriate for the view group. As you can see in figure 1, the parent view group defines layout parameters for each child view (including the child view group).

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


共 (2) 个答案

  1. # 1 楼答案

    您有点困惑,layout param并不拥有特定的XML对象如果你把它放在一个子XML XXXView或XXXLAyout中,它就会明白它的右边必须与父右边在同一个位置

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

  2. # 2 楼答案

    Layout

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

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

    度量过程使用两个类来传递维度。视图使用View.MeasureSpec类来告诉他们的父母他们希望如何被测量和定位。基本LayoutParams类只描述视图的宽度和高度。对于每个尺寸,它可以指定以下其中一个:

    • 确切数字
    • 匹配父视图,这意味着视图希望与父视图一样大 (减去填充)
    • 包装内容,这意味着视图要足够大 包含其内容(加上填充)

    对于ViewGroup的不同子类,有LayoutParams的子类。例如,AbsoluteLayout有自己的LayoutParams子类,它添加了一个X和Y值

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

    • 未指定:父级用于确定所需的 子视图的维度。例如,LinearLayout可能会调用 在其子对象上测量(),高度设置为“未指定”,宽度设置为“未指定” 精确到240,以了解子视图希望给出的高度 240像素的宽度
    • 确切地说:父级使用此选项将精确的大小施加到 小孩孩子必须使用这个尺寸,并保证其所有 后代将适应这种规模
    • 至多:父级使用此选项来对对象施加最大大小 小孩孩子必须保证自己及其所有后代 适合这个尺寸

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