解决android:gravity和android:layout_gravity之间的冲突问题

4
请注意以下简单的布局。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="bottom"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_gravity="top" >

        <Button
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Button" />

    </LinearLayout>

</LinearLayout>

外部LinearLayout指定了它的属性

android:gravity="bottom"

这意味着它希望它的子元素“掉到底部”。

内部LinearLayout指定了

android:layout_gravity="top"

这意味着它希望自己位于其封闭布局的顶部(要指定android:layout_gravity,显然必须直接编辑XML文件。从Eclipse中似乎找不到到达该属性的方法。无论如何...)。
Android如何解决这种冲突?以上例子表明gravity属性会覆盖layout_gravity属性。这是否是普遍解决冲突的方法?
1个回答

1

从查看LinearLayout中的layoutVertical()方法来看,LinearLayout本身的gravity决定了子项的定位。

每个子项的layout_gravity仅用于沿着“另一个方向”(即左右)进行布局。

首先:

    final int majorGravity = mGravity & Gravity.VERTICAL_GRAVITY_MASK;
    final int minorGravity = mGravity & Gravity.RELATIVE_HORIZONTAL_GRAVITY_MASK;

    switch (majorGravity) {
       case Gravity.BOTTOM:
           childTop = ... 
           break;

       // ... same for CENTER_VERTICAL and TOP
    }

然后,对于每个子元素:
    for (int i = 0; i < count; i++) {
        final View child = getVirtualChildAt(i);

        final LinearLayout.LayoutParams lp =
                (LinearLayout.LayoutParams) child.getLayoutParams();

        int gravity = lp.gravity;
        if (gravity < 0) {
            gravity = minorGravity;
        }

        final int layoutDirection = getLayoutDirection();
        final int absoluteGravity = Gravity.getAbsoluteGravity(gravity, layoutDirection);
        switch (absoluteGravity & Gravity.HORIZONTAL_GRAVITY_MASK) {
            case Gravity.CENTER_HORIZONTAL:
                childLeft = ...
                break;

            // ... same for RIGHT and LEFT

同样地,对于layoutHorizontal()也是如此。

另外,只是一个注释,但是android:layout_gravity可以从Java代码中访问。它是LinearLayout.LayoutParams类中的gravity字段(设置为子视图的LayoutParams)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接