android - 解决android :gravity and android:layout_gravity之间的冲突

标签 android android-layout android-linearlayout

考虑以下简单的布局。

<?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>

outer LinearLayout 指定它有

android:gravity="bottom"

这意味着它希望它的 child “跌到谷底”。

inner LinearLayout 指定

android:layout_gravity="top"

这意味着它希望将自身 放置在其封闭布局的顶部。 (要指定 android:layout_gravity,显然必须直接编辑 XML 文件。似乎没有办法从 Eclipse 获取该属性。无论如何...)

Android 是如何解决这样的冲突的?上面的示例表明 gravity 属性覆盖了 layout_gravity 属性。冲突通常是这样解决的吗?

最佳答案

查看 LinearLayout 中的 layoutVertical() 方法, LinearLayout 本身的gravity 决定了子元素的位置

每个 child 的 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
    }

然后,对于每个 child :

    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

layoutHorizo​​ntal() 等价。

此外,这只是一个注释,但 android:layout_gravity 可以 从 Java 代码访问。这是 gravity fieldLinearLayout.LayoutParams 类中(设置为 subview 的 LayoutParams)。

关于android - 解决android :gravity and android:layout_gravity之间的冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24826675/

相关文章:

Android 应用程序 - 如何为 iPhone 开发?

android - 如何垂直居中图表(使用 mpandroidchart 中的 LineChart)?

android - 如何以编程方式从字符串设置布局背景色调?

android - ListView动画刷新适配器android

android - 用 Observable Rxjava 包装遗留的 AsyncTask?

android - 如何将粗体文本设置为 Android Snackbar 操作文本?

Android线性布局问题

java - Android 在其他 TextView 上方添加 TextView

android - 将自定义对象添加到 ArrayAdapter。如何抓取数据?

java - Android - 使用相机拍照