Android 中的 gravity 和 layout_gravity 有什么区别?

我知道我们可以为android:gravityandroid:layout_gravity属性设置以下值:

  1. center
  2. center_vertical
  3. center_horizontal

但是我对这两者感到困惑。

android:gravityandroid:layout_gravity的用法有什么区别?

答案

他们的名字应该可以帮助您:

  • android:gravity设置的内容(即其子视图)重力View它的使用。
  • android:layout_gravity设置ViewLayout相对于其父View的重力。

而一个例子是在这里

内部 - 外部

  • gravity将内容排列在视图内部
  • lay <strong>out</strong> _gravity自编视图的位置本身之外

有时也有助于查看图片。绿色和蓝色是TextViews ,其他两种背景颜色是LinearLayouts

在此处输入图片说明

笔记

  • layout_gravity不适用于RelativeLayout视图。将其用于LinearLayoutFrameLayout视图。请参阅我的补充答案以获取更多详细信息。
  • 视图的宽度(或高度)必须大于其内容。否则gravity将不会有任何影响。因此, wrap_contentgravity没有意义。
  • 视图的宽度(或高度)必须小于父视图。否则, layout_gravity将不起作用。因此, match_parentlayout_gravity在一起毫无意义。
  • layout_gravity=center在这里看起来与layout_gravity=center_horizontal相同,因为它们处于垂直线性布局中。在这种情况下,您不能垂直居中,因此layout_gravity=center仅水平居中。
  • 该答案仅涉及在布局内的视图上设置gravitylayout_gravity 。若要查看在设置父布局本身的gravity时会发生什么,请查看我上面提到的补充答案 。 (摘要: gravityRelativeLayout上不能很好地工作,但在LinearLayout可能很有用。)

因此请记住, layout _gravity 在其layout 中安排一个视图。重力将内容安排在视图内部。

XML 文件

这是上面图像的 xml 供您参考:

<?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:orientation="vertical" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:background="#e3e2ad"
        android:orientation="vertical" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:textSize="24sp"
            android:text="gravity=" />

        <TextView
            android:layout_width="200dp"
            android:layout_height="40dp"
            android:background="#bcf5b1"
            android:gravity="left"
            android:text="left" />

        <TextView
            android:layout_width="200dp"
            android:layout_height="40dp"
            android:background="#aacaff"
            android:gravity="center_horizontal"
            android:text="center_horizontal" />

        <TextView
            android:layout_width="200dp"
            android:layout_height="40dp"
            android:background="#bcf5b1"
            android:gravity="right"
            android:text="right" />

        <TextView
            android:layout_width="200dp"
            android:layout_height="40dp"
            android:background="#aacaff"
            android:gravity="center"
            android:text="center" />

    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:background="#d6c6cd"
        android:orientation="vertical" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:textSize="24sp"
            android:text="layout_gravity=" />

        <TextView
            android:layout_width="200dp"
            android:layout_height="40dp"
            android:layout_gravity="left"
            android:background="#bcf5b1"
            android:text="left" />

        <TextView
            android:layout_width="200dp"
            android:layout_height="40dp"
            android:layout_gravity="center_horizontal"
            android:background="#aacaff"
            android:text="center_horizontal" />

        <TextView
            android:layout_width="200dp"
            android:layout_height="40dp"
            android:layout_gravity="right"
            android:background="#bcf5b1"
            android:text="right" />

        <TextView
            android:layout_width="200dp"
            android:layout_height="40dp"
            android:layout_gravity="center"
            android:background="#aacaff"
            android:text="center" />

    </LinearLayout>

</LinearLayout>

有关

区别

android:layout_gravity是视图的外部重力。指定视图应接触其父级边框的方向。

android:gravity是该视图的内部重力。指定其内容应沿哪个方向对齐。

HTML / CSS 等效项

Android                 | CSS
————————————————————————+————————————
android:layout_gravity  | float
android:gravity         | text-align

简单的技巧来帮助您记住

layout-gravity作为 “外部重力”。

简短的答案:使用android:gravitysetGravity()控制容器的所有子视图的重力;使用android:layout_gravitysetLayoutParams()控制容器中单个视图的重力。

长话大说:要控制线性布局容器(例如LinearLayoutRadioGroup重力,有两种方法:

1)要控制LinearLayout容器的所有子视图的重力(如您在书中所做的那样),请在布局 XML 文件中使用android:gravity (而不是android:layout_gravity )或在代码中使用setGravity()方法。

2)要控制子视图在其容器中的重力,请使用android:layout_gravity XML 属性。在代码中,需要获取视图的LinearLayout.LayoutParams并设置其重力。下面是一个代码示例,该示例将按钮设置在水平容器的底部:

import android.widget.LinearLayout.LayoutParams;
import android.view.Gravity;
...

Button button = (Button) findViewById(R.id.MyButtonId);
// need to cast to LinearLayout.LayoutParams to access the gravity field
LayoutParams params = (LayoutParams)button.getLayoutParams(); 
params.gravity = Gravity.BOTTOM;
button.setLayoutParams(params);

对于水平LinearLayout容器,其子视图的水平重力一个接一个地左对齐,并且无法更改。将android:layout_gravity设置为center_horizontal无效。默认的垂直重力为中心(或 center_vertical),可以更改为顶部或底部。实际上,默认的layout_gravity值为-1但 Android 会将其垂直居中。

要在水平线性容器中更改子视图的水平位置,可以使用子视图的layout_weight ,margin 和 padding。

类似地,对于垂直视图组容器,其子视图的垂直重力在一个顶部与另一个视图之间对齐,并且不能更改。默认的水平重力为 center(或center_horizontal ),可以更改为左或右。

实际上,诸如按钮之类的子视图也具有android:gravity XML 属性和setGravity()方法来控制其子视图 - 其中的文本。 Button.setGravity(int)链接到此developer.android.com 条目

根据我的收集, layout_gravity是该视图在其父视图中的重力,而重力是该视图在子视图中的子重力。

我认为这是对的,但找出答案的最佳方法是随处游玩。

看一下图像以了解重力

尽管问题已经回答,但我还是有一些示例说明了重力,layout_gravity 和 layout_weight 的使用。

您可以在http://juanpickselov.com/LayoutExamples.zip 中找到示例。

我在 Eclipse 中创建了文件,删除了. svn 子文件夹,并包含了样式,字符串,颜色等。布局文件是演示的重点。由于我是 Java 和 Android 开发的新手,因此可能会发现 Java 效率低下。可以将文件复制到 Eclipse 项目中,或者我也已在 Netbeans 中将它们与可用于该 IDE 的 Android 开发插件一起使用。

如果要在视图中设置内容的重力,则将使用 “android:gravity”;如果要在其父视图中设置该视图(整体)的重力,则将使用 “android: layout_gravity”。

只是以为我会在这里添加自己的解释 - 来自 iOS 的背景,这就是我将 iOS 术语中的这两个内部化的方式:“布局重力” 会影响您在超级视图中的位置。 “重力” 会影响子视图在您内部的位置。换句话说,“布局重力” 使您自己定位,而重力使孩子定位。

gravitylayout-gravity有很多区别。我将解释我对这两个概念的经验( 由于观察和获得一些网站而获得的所有信息 )。

FrameLayout使用重力和布局重力.....

注意:-

  1. 由于某些用户有答案,因此在视图内容中使用了重力,并且所有ViewGroup Layout都使用重力

  2. 由于某些用户有答案,因此Layout-gravity与父视图一起使用。

  3. Gravity and Layout-gravity 对于 FrameLayout 更有用We can't use Gravity and Layout-gravity在 FrameLayout 的 Tag ... 中We can't use Gravity and Layout-gravity

  4. 我们可以使用layout-gravityFrameLayout任何位置设置 Child View。

  5. 我们可以使用 FrameLayout 内部的每个重力值(例如: center_verticalcenter_horizontalcentertop等),但其他 ViewGroup Layouts 则不可能。

  6. FrameLayout完全在Layout-gravity上工作。示例:- 如果您使用FrameLayout无需更改整个布局即可添加新的 View。您只需将 View作为最后一个添加FrameLayout然后为他提供具有值的Layout-gravity 。( 这是 FrameLayout 的 layout-gravity 的优点 )。

看例子...

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:textSize="25dp"
        android:background="#000"
        android:textColor="#264bd1"
        android:gravity="center"
        android:layout_gravity="center"
        android:text="Center Layout Gravity"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="80dp"
        android:textSize="25dp"
        android:background="#000"
        android:textColor="#1b64b9"
        android:gravity="bottom"
        android:layout_gravity="bottom|center"
        android:text="Bottom Layout Gravity" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="80dp"
        android:textSize="25dp"
        android:background="#000"
        android:textColor="#d75d1c"
        android:gravity="top"
        android:layout_gravity="top|center"
        android:text="Top Layout Gravity"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="80dp"
        android:textSize="25dp"
        android:background="#000"
        android:layout_marginTop="100dp"
        android:textColor="#d71f1c"
        android:gravity="top|right"
        android:layout_gravity="top|right"
        android:text="Top Right Layout Gravity"/>


    <TextView
        android:layout_width="wrap_content"
        android:layout_height="80dp"
        android:textSize="25dp"
        android:background="#000"
        android:layout_marginBottom="100dp"
        android:textColor="#d71cb2"
        android:layout_gravity="bottom"
        android:gravity="bottom"
        android:text="Top Left Layout Gravity"/>

</FrameLayout>

输出:-

11

在 LinearLayout 中使用重力和布局重力.....

Gravity工作原理与上面相同,但这里的区别在于,我们可以在LinearLayout ViewRelativeLayout View内使用 Gravity,而这在FrameLayout View是不可能的。

垂直方向的 LinearLayout ....

注意:- 在这里,我们只能设置layout_gravity 3 个值,即( left | right | center (也称为center_horizontal ))。

看例子:-

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:orientation="vertical"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="100dp"
        android:textSize="25dp"
        android:background="#000"
        android:textColor="#264bd1"
        android:gravity="center"
        android:layout_gravity="center_horizontal"
        android:text="Center Layout Gravity \nor \nCenter_Horizontal"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="80dp"
        android:textSize="25dp"
        android:background="#000"
        android:layout_marginTop="20dp"
        android:textColor="#d75d1c"
        android:layout_gravity="right"
        android:text="Right Layout Gravity"/>


    <TextView
        android:layout_width="wrap_content"
        android:layout_height="80dp"
        android:textSize="25dp"
        android:background="#000"
        android:layout_marginBottom="100dp"
        android:textColor="#d71cb2"
        android:layout_gravity="left"
        android:layout_marginTop="20dp"
        android:gravity="bottom"
        android:text="Left Layout Gravity"/>

</LinearLayout>

输出:-

22

方向水平的 LinearLayout ....

注意:- 在这里我们还可以设置 3 个layout_gravity值,即( top | bottom | center (也称为center_vertical ))。

看例子:-

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:orientation="horizontal"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="120dp"
        android:layout_height="100dp"
        android:textSize="25dp"
        android:background="#000"
        android:textColor="#264bd1"
        android:gravity="center"
        android:layout_gravity="bottom"
        android:text="Bottom \nLayout \nGravity"/>

    <TextView
        android:layout_width="120dp"
        android:layout_height="100dp"
        android:textSize="25dp"
        android:background="#000"
        android:layout_marginTop="20dp"
        android:textColor="#d75d1c"
        android:layout_gravity="center"
        android:text="Center \nLayout \nGravity"/>


    <TextView
        android:layout_width="150dp"
        android:layout_height="100dp"
        android:textSize="25dp"
        android:background="#000"
        android:layout_marginBottom="100dp"
        android:textColor="#d71cb2"
        android:layout_gravity="left"
        android:layout_marginTop="20dp"
        android:text="Left \nLayout \nGravity"/>

</LinearLayout>

输出:-

33

注意:- 我们无法在RelativeLayout Views使用layout_gravity ,但可以使用gravityRelativeLayout设置为相同位置。