ChatGPT解决这个技术问题 Extra ChatGPT

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

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

center center_vertical center_horizontal等

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

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

容易记住的技巧:将“布局重力”作为“外重力”
中心 == 中心垂直 | center_horizontal
这些视频帮助我了解了其中的区别:youtube.com/watch?v=DxfYeAUd238 youtube.com/watch?v=1FyAIWLVcTc
ImageView 的行为似乎与 TextView 的不同。

d
danronmoon

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

android:gravity 设置它所使用的视图的内容(即它的子视图)的重力。

android:layout_gravity 设置 View 或 Layout 相对于其父级的重力。

here 就是一个例子。


基本上,所有带有 layout_ 的东西都定义了影响外部元素的东西。
看,我觉得这很有趣,因为如果我不看名字,我的直觉是相反的。每次,我认为“layout_gravity”的意思是“这个 ViewGroup 如何布置它的内容的重力”,而“gravity”是“这个 View 被吸引到的地方”。
那么,如果 android:gravity 设置为左侧,而其子项的 android:layout_gravity 设置为右侧,会发生什么情况呢?孩子们会站在哪一边?
正如@Suragch 评论他的答案,layout_gravity 仅适用于 LinearLayout 和 FrameLayout。 LinearLayout 虽然有限制。
@Thupten 非常好的问题。我猜一个会占上风(我猜是孩子们的layout_gravity),另一个只是主流的默认值。
C
Community

Inside - Outside

重力在视图内排列内容。

layout_gravity 将视图的位置安排在自身之外。

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

https://i.stack.imgur.com/nymDt.png

笔记

layout_gravity 不适用于 RelativeLayout 中的视图。将它用于 LinearLayout 或 FrameLayout 中的视图。有关更多详细信息,请参阅我的补充答案。

视图的宽度(或高度)必须大于其内容。否则重力不会有任何影响。因此, wrap_content 和重力一起是没有意义的。

视图的宽度(或高度)必须小于父视图。否则 layout_gravity 不会有任何影响。因此, match_parent 和 layout_gravity 放在一起是没有意义的。

layout_gravity=center 在这里看起来与 layout_gravity=center_horizontal 相同,因为它们处于垂直线性布局中。在这种情况下,您不能垂直居中,因此 layout_gravity=center 只能水平居中。

该答案仅涉及在布局中的视图上设置重力和 layout_gravity。要查看设置父布局本身的重力时会发生什么,请查看我上面提到的补充答案。 (总结:重力在 RelativeLayout 上效果不佳,但对 LinearLayout 很有用。)

所以请记住,layout_gravity 在其布局中安排了一个视图。重力在视图内排列内容。

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>

有关的

视图的填充和边距之间的区别

Match_parent vs wrap_content

如何以编程方式设置 LinearLayout 的重力和布局重力


在视觉上看到它之后似乎更容易,感谢Suragch。
V
Vishnu Haridas

区别

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

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

HTML/CSS 等价物

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

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

帮助你记住的简单技巧

layout-gravity 视为“Lay-outside-gravity”。


当您具有 Web 开发背景时,它更有意义。
G
General Grievance

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

长话短说:要在 LinearLayoutRadioGroup 等线性布局容器中控制重力,有两种方法:

要控制 LinearLayout 容器的所有子视图的重力(就像您在书中所做的那样),请在布局 XML 文件中使用 android:gravity(不是 android:layout_gravity)或在代码中使用 setGravity() 方法。要控制其容器中子视图的重力,请使用 android:layout_gravity XML 属性。在代码中,需要获取视图的 LinearLayout.LayoutParams 并设置其重力。这是一个将按钮设置为水平方向容器底部的代码示例: import android.widget.LinearLayout.LayoutParams;导入android.view.Gravity; ... 按钮按钮 = (Button) findViewById(R.id.MyButtonId); // 需要转换为 LinearLayout.LayoutParams 才能访问重力场 LayoutParams params = (LayoutParams)button.getLayoutParams(); params.gravity = Gravity.BOTTOM; button.setLayoutParams(params);

对于水平 LinearLayout 容器,其子视图的水平重力是一个接一个的左对齐,不能更改。将 android:layout_gravity 设置为 center_horizontal 无效。默认的垂直重力是 center(或 center_vertical),可以更改为 top 或 bottom。实际上默认的 layout_gravity 值为 -1 但 Android 将其垂直居中。

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

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

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


m
matto1990

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

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


A
Akshay Paliwal

https://i.stack.imgur.com/TzaKU.png

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


A
Arbaz_Ali

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


M
Mahendra Liya

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

记住 layout_gravity 中的 out,这将帮助您记住 android:layout_gravity 指的是 outside看法


A
Arbaz_Ali

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

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

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


s
sushildlh

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

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

笔记:-

由于某些用户有答案,因此在视图内容中使用了重力,并且对于所有视图组布局都是相同的。 Layout-gravity 与父视图一起使用,因为某些用户有答案。 Gravity 和 Layout-gravity 对 FrameLayout childs 更有用。我们不能在 FrameLayout 的标签中使用 Gravity 和 Layout-gravity .... 我们可以使用 layout-gravity 在 FrameLayout 中的任何位置设置子视图。我们可以在 FrameLayout 中使用重力的每一个值(例如:center_vertical、center_horizontal、center、top 等),但对于其他 ViewGroup 布局是不可能的。 FrameLayout 完全在 Layout-gravity 上工作。示例:- 如果您在 FrameLayout 上工作,则无需更改整个布局即可添加新视图。您只需在 FrameLayout 中添加 View 作为最后一个,并为他提供具有值的 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>

输出:-

https://i.stack.imgur.com/La0T7.png

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

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>

输出:-

https://i.stack.imgur.com/NRTEI.png

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

注意:- 这里我们还可以设置 layout_gravity 的 3 个值,即 (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>

输出:-

https://i.stack.imgur.com/fk8u8.png

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


如果您将所有 view 中的 textColor 设置为白色,那就太好了。 :D
你确定吗?它看起来是黑白的,这就是为什么我为每个视图使用不同的颜色。
C
Catalina

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

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

实际上,我切换到 RelativeLayout,然后在 2 个包含的 TextView 上使用 layout_alignParentLeftlayout_alignParentRight 以使它们在一条线上去最左边和最右边。


A
Abhishek T.

两者的基本区别在于——

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

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


I
IntelliJ Amiya

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

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

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

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


我认为不需要新的答案,因为已经发布了多个答案并且涵盖了几乎相同的内容!
A
Ali Raza

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

重要:(在可用空间内沿 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 内的文本会四处移动。 (整个概念也适用于此)


P
Praveen Gaur

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


C
Chintak Patel

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

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


layout_gravity:仅用于当前视图在其相对父级上下文中的重力,而不是在其父级内部的其他视图。
J
Joel

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


T
Tulsi
android:gravity

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

android:layout_gravity 

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


V
Vamsi

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

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


n
nidhi

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

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


A
Arbaz_Ali

Gravity 和 layout_gravity 都是 XML 属性。

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

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

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