我知道我们可以为 android:gravity
和 android:layout_gravity
属性设置以下值:
center center_vertical center_horizontal等
但我对这两个都感到困惑。
android:gravity
和 android:layout_gravity
的用法有什么区别?
ImageView
的行为似乎与 TextView
的不同。
他们的名字应该可以帮助你:
android:gravity 设置它所使用的视图的内容(即它的子视图)的重力。
android:layout_gravity 设置 View 或 Layout 相对于其父级的重力。
here 就是一个例子。
重力在视图内排列内容。
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 的重力和布局重力
区别
android:layout_gravity
是视图的外部重力。指定视图应该接触其父级边框的方向。
android:gravity
是该视图的内部重力。指定其内容应对齐的方向。
HTML/CSS 等价物
(如果您来自 Web 开发背景)
Android | CSS
————————————————————————+————————————
android:layout_gravity | float
android:gravity | text-align
帮助你记住的简单技巧
将 layout-gravity
视为“Lay-outside-gravity”。
简答:使用 android:gravity
或 setGravity()
来控制容器的所有子视图的重力;使用 android:layout_gravity
或 setLayoutParams()
来控制容器中单个视图的重力。
长话短说:要在 LinearLayout
或 RadioGroup
等线性布局容器中控制重力,有两种方法:
要控制 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。
据我所知,layout_gravity 是该视图在其父视图内的重力,而重力是该视图内子视图的重力。
我认为这是正确的,但找出答案的最好方法是到处玩。
https://i.stack.imgur.com/TzaKU.png
查看图像以清楚地了解重力
如果我们想在视图中设置内容的重力,那么我们将使用“android:gravity”,如果我们想在其父视图中设置该视图(作为一个整体)的重力,那么我们将使用“android:布局重力”。
记住这一点的一个简单技巧是重力适用于我们在地球内部。因此,android:gravity
用于 inside 视图。
记住 layout_gravity 中的 out,这将帮助您记住 android:layout_gravity
指的是 outside看法
只是想我会在这里添加我自己的解释 - 来自 iOS 的背景,这就是我在 iOS 术语中内化两者的方式:
布局重力会影响您在超级视图中的位置。重力会影响您的子视图在您内部的位置。
换句话说,布局重力定位你自己,而重力定位你的孩子。
gravity
和 layout-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 View
和 RelativeLayout 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
,但我们可以使用 gravity
将 RelativeLayout
子级设置为相同的位置......
view
中的 textColor
设置为白色,那就太好了。 :D
我在 Sandip 的博客上看到的几乎错过的东西解决了我的问题。他说 layout_gravity
不适用于 LinearLayout
。
如果您正在使用 LinearLayout
并且重力设置让您发疯(像我一样),那么请切换到其他东西。
实际上,我切换到 RelativeLayout
,然后在 2 个包含的 TextView
上使用 layout_alignParentLeft
和 layout_alignParentRight
以使它们在一条线上去最左边和最右边。
两者的基本区别在于——
android:gravity 用于视图的子元素。
android:layout_gravity 用于此元素相对于父视图。
android:gravity
用于指定如何将对象的内容放置在对象本身内。换句话说,android:gravity 用于指定视图内容的重力。
android:layout_gravity
是子级可以提供给其父级的属性,以指定视图在其父级中的重力。
有关更多详细信息,您可以访问
http://developer.android.com/reference/android/widget/LinearLayout.LayoutParams.html
重力:允许您在容器内移动内容。 (如何放置子视图)。
重要:(在可用空间内沿 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 内的文本会四处移动。 (整个概念也适用于此)
Gravity 用于设置视图中的文本对齐方式,但 layout_gravity 用于设置它自己的视图。举个例子,如果你想对齐用editText编写的文本然后使用重力,你想对齐这个editText或任何按钮或任何视图然后使用layout_gravity,所以它非常简单。
重力:用于简单的视图,如 textview、edittext 等。
layout_gravity:仅用于当前视图的重力在其相对父视图的上下文中,如线性布局或框架布局,以使视图处于中心或其父的任何其他重力。
android:gravity
设置子级的重力(位置),而 android:layout_gravity
设置视图本身的位置。希望能帮助到你
android:gravity
用于调整相对于其指定位置(分配区域)的视图内容。如果 layout_width
等于 "wrap_content"
,android:gravity="left"
不会做任何事情
android:layout_gravity
用于相对于父文件或布局文件的视图本身。
android:gravity
->设置其使用的视图内容的重力。
android:layout_gravity
->设置其父视图或布局的重力
重力——适用于自己的观点。
layout-gravity---适用于与其父级相关的视图。
Gravity 和 layout_gravity 都是 XML 属性。
android:gravity 属性用于安排视图内内容的位置(例如 Button 小部件内的文本)。
android:layout_gravity 用于安排整个 View 相对于它的容器的位置。
有关更多详细信息,您可以查看此 link。
layout_
的东西都定义了影响外部元素的东西。android:gravity
设置为左侧,而其子项的android:layout_gravity
设置为右侧,会发生什么情况呢?孩子们会站在哪一边?