1424

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

  1. center
  2. center_vertical
  3. center_horizontal, ETC。

但我对这两个都感到困惑。

android:gravity和的用法有什么区别android:layout_gravity

4

21 回答 21

1426

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

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

这里有一个例子。

于 2010-08-14T09:31:49.493 回答
576

内部 - 外部

  • gravity排列视图内的内容。
  • layout_gravity将视图的位置安排在自身之外

有时,看一张照片也有帮助。绿色和蓝色是TextViews,其他两种背景颜色是LinearLayouts

在此处输入图像描述

笔记

  • layout_gravity不适用于 a 中的视图RelativeLayout。将其用于 aLinearLayout或中的视图FrameLayout。有关更多详细信息,请参阅我的补充答案
  • 视图的宽度(或高度)必须大于其内容。否则gravity不会有任何影响。因此,wrap_contentgravity在一起是没有意义的。
  • 视图的宽度(或高度)必须小于父视图。否则layout_gravity不会有任何影响。因此,match_parentlayout_gravity在一起是没有意义的。
  • layout_gravity=center看起来与此处相同,因为layout_gravity=center_horizontal它们处于垂直线性布局中。在这种情况下,您不能垂直居中,因此layout_gravity=center只能水平居中。
  • 该答案仅涉及布局中的设置gravitylayout_gravity视图。gravity要查看设置父布局本身的时会发生什么,请查看我上面提到的补充答案。(总结:gravity在 a 上效果不佳,RelativeLayout但对 a 很有用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>

有关的

于 2014-10-04T05:43:23.333 回答
478

区别

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

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

HTML/CSS 等价物

(如果您来自 Web 开发背景)

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

帮助你记住的简单技巧

layout-gravity“外重力”为例。

于 2011-07-25T17:07:40.587 回答
42

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

长话短说:要控制线性布局容器中的重力,例如LinearLayoutor RadioGroup,有两种方法:

  1. 要控制容器的所有子视图的重力LinearLayout(就像您在书中所做的那样),请在布局 XML 文件或代码中的方法中使用android:gravity(not )。android:layout_gravitysetGravity()

  2. 要控制子视图在其容器中的重力,请使用android:layout_gravityXML 属性。在代码中,需要获取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_gravitycenter_horizontal无效。默认的垂直重力是 center(或 center_vertical),可以更改为 top 或 bottom。实际上默认layout_gravity值是-1但Android将它垂直居中。

要更改水平线性容器中子视图的水平位置,可以使用layout_weight子视图的 , 边距和填充。

同样,对于垂直视图组容器,其子视图的垂直重力上下对齐,并且不能更改。默认水平重心为中心(或center_horizontal),可更改为左或右。

实际上,像按钮这样的子视图也具有android:gravityXML 属性和setGravity()控制其子视图的方法——其中的文本。Button.setGravity(int)链接到这个developer.android.com条目

于 2011-07-30T20:01:51.717 回答
38

据我所知, layout_gravity是该视图在其父视图内的重力,而重力是该视图内子视图的重力。

我认为这是正确的,但找出答案的最好方法是到处玩。

于 2010-08-14T09:37:23.927 回答
29

查看图像以清楚地了解重力

于 2015-02-04T07:17:43.163 回答
12

如果我们想在视图中设置内容的重力,那么我们将使用“android:gravity”,如果我们想在其父视图中设置该视图(作为一个整体)的重力,那么我们将使用“android:布局重力”

于 2013-04-09T21:21:22.610 回答
9

记住这一点的一个简单技巧是重力适用于我们在地球内部。所以,android:gravity是在视图内部。

记住out in layout _gravity将帮助您记住它android:layout_gravity的是视图之外

于 2016-11-29T08:41:20.907 回答
8

只是想我会在这里添加我自己的解释 - 来自 iOS 的背景,这就是我在 iOS 术语中内化两者的方式:

布局重力会影响您在超级视图中的位置。重力会影响您的子视图在您内部的位置。

换句话说,布局重力定位你自己,而重力定位你的孩子。

于 2015-04-15T20:56:16.610 回答
7

gravity和有很多不同layout-gravity。我将解释我对这两个概念的经验(我通过观察和一些网站获得的所有信息)。

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

笔记:-

  1. 由于某些用户有答案,因此在查看内容中使用了重力ViewGroup Layout,并且对所有人都是一样的。

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

  3. Gravity and Layout-gravity与孩子们一起工作更有用。在 FrameLayout 的 Tag ....FrameLayoutWe can't use Gravity and Layout-gravity

  4. 我们可以在FrameLayoutusing中的任何位置设置子视图layout-gravity

  5. 我们可以使用 FrameLayout 中的每一个重力值(例如:- center_verticalcenter_horizontalcentertop等),但对于其他 ViewGroup Layouts 是不可能的。

  6. FrameLayout全力以赴Layout-gravity。示例:- 如果您继续工作,FrameLayout无需更改整个布局即可添加新视图。您只需在最后添加 ViewFrameLayout并为他Layout-gravity提供价值。(这是 FrameLayout 布局重力的优点)。

看看例子......

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

输出:-

g1

在 LinearLayout 中使用 Gravity 和 Layout-gravity .....

Gravity工作方式与上面相同,但不同之处在于我们可以在内部使用重力,LinearLayout ViewRelativeLayout ViewFrameLayout View.

具有垂直方向的LinearLayout ....

注意:- 这里我们只能设置 3 个值layout_gravityleft| 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>

输出:-

g2

具有水平方向的LinearLayout ....

注意:- 在这里我们还可以设置 3 个值layout_gravitytop| 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>

输出:-

g3

注意:- 我们不能在中使用layout_gravityRelativeLayout Views但我们可以使用gravityRelativeLayout孩子设置为相同的位置....

于 2016-10-17T06:48:08.023 回答
5

我在 Sandip 的博客上看到的几乎错过的东西解决了我的问题。他说不layout_gravity适用LinearLayout

如果您使用的是 aLinearLayout并且重力设置让您发疯(像我一样),那么请切换到其他东西。

我实际上切换到一个RelativeLayoutthen used layout_alignParentLeftand layout_alignParentRighton the 2 contains TextViews 让它们在一条线上去最左边和最右边。

于 2014-07-24T19:34:32.130 回答
4

两者的基本区别在于——

android:gravity用于视图的子元素。

android:layout_gravity用于此元素相对于父视图。

于 2016-07-26T14:43:01.340 回答
3

android:gravity用于指定如何将对象的内容放置在对象本身内。换句话说,android:gravity 用于指定视图内容的重力。

android:layout_gravity是孩子可以提供给其父母的属性,以指定其父母中的视图的重力。

有关更多详细信息,您可以访问

http://developer.android.com/reference/android/widget/LinearLayout.LayoutParams.html

于 2015-05-10T12:17:56.947 回答
3

重力:允许您在容器内移动内容。(如何放置子视图)。

重要:(在可用空间内沿 X 轴或 Y 轴移动)。

示例:假设您使用 LinearLayout (Height: match_parent, Width: match_parent) 作为根级元素,那么您将拥有完整的框架空间;并且子视图说LinearLayout内的2个TextView(高度:wrap_content,宽度:wrap_content)可以使用父级上的相应重力值沿x / y轴移动。

Layout_Gravity:允许您仅沿 x 轴覆盖父重力行为。

重要提示:(在可用空间内沿 X 轴移动 [覆盖])。

示例:如果您记住前面的示例,我们知道重力使我们能够沿 x/y 轴移动,即;在 LinearLayout 中放置 TextViews。假设 LinearLayout 指定重力:中心;这意味着每个 TextView 都需要垂​​直和水平居中。现在,如果我们希望 TextView 之一向左/向右移动,我们可以使用 TextView 上的 layout_gravity 覆盖指定的重力行为。

奖励:如果你深入挖掘,你会发现 TextView 中的文本充当子视图;因此,如果您在 TextView 上应用重力,则 TextView 内的文本会四处移动。(整个概念也适用于此)

于 2018-04-30T10:36:24.217 回答
1

Gravity 用于设置视图中的文本对齐方式,但 layout_gravity 用于设置它自己的视图。举个例子,如果你想对齐用editText编写的文本然后使用重力,你想对齐这个editText或任何按钮或任何视图然后使用layout_gravity,所以它非常简单。

于 2017-05-17T18:15:28.860 回答
1

重力:用于简单的视图,如 textview、edittext 等。

layout_gravity:仅用于当前视图的重力在其相对父视图的上下文中,如线性布局或框架布局,以使视图处于中心或其父的任何其他重力。

于 2017-06-01T11:32:19.603 回答
1

设置孩子的android:gravity重力(位置),而android:layout_gravity设置视图本身的位置。希望能帮助到你

于 2020-04-23T05:27:23.647 回答
0
android:gravity

用于调整相对于其指定位置(分配区域)的视图内容。android:gravity="left" 如果layout_width等于"wrap_content"

android:layout_gravity 

用于相对于父文件或布局文件的视图本身。

于 2017-01-02T12:13:14.313 回答
0

android:gravity-> 设置其使用的视图内容的重力。

android:layout_gravity-> 设置它的父视图或布局的重力

于 2017-07-12T17:10:04.670 回答
0

重力——适用于自己的观点。

layout-gravity---适用于与其父级相关的视图。

于 2018-11-13T10:07:09.587 回答
0

Gravity 和 layout_gravity 都是 XML 属性。

android:gravity 属性用于安排视图内内容的位置(例如 Button 小部件内的文本)。

android:layout_gravity用于安排整个 View 相对于它的容器的位置。

有关更多详细信息,您可以查看此链接

于 2021-10-29T06:13:22.527 回答