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


1327

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

  1. center
  2. center_vertical
  3. center_horizontal

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

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


264
容易记住的技巧:将“布局重力”作为“布局重力”
Vishnu Haridas

6
center == center_vertical | center_horizo​​ntal
Yousha Aleayoub

4
这些视频对我的理解有所帮助:youtube.com/watch? v
罗尼·卡斯特罗

ImageView的行为似乎与有所不同TextView
samis

Answers:


1345

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

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

而一个例子是在这里


88
基本上,所有带有的layout_东西都定义了影响外部元素的东西。
Triang3l 2013年

29
瞧,我觉得这很有趣,因为如果我不提及名字,我的直觉就是相反的。每次,我认为“ layout_gravity”表示“此ViewGroup对其内容进行布局的方式的引力”,“ gravity”是“此视图引向的位置”。
食人魔

15
那么,如果将android:gravity设置为左侧,将其子级android:layout_gravity设置为右侧,会发生什么呢?孩子们将向哪一侧对齐?
2014年

2
正如@Suragch在回答他的答案时,layout_gravity仅在LinearLayout和FrameLayout中有效。LinearLayout对此有一些限制。
Marco Luglio 2015年

1
@Thupten很好的问题。我猜一个会占上风(我猜孩子们的layout_gravity),而另一个只是占主导地位的默认设置。
Trilarion

521

内部-外部

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

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

在此处输入图片说明

笔记

  • layout_gravity不适合的意见在工作RelativeLayout。将其用于LinearLayout或中的视图FrameLayout。请参阅我的补充答案以获取更多详细信息。
  • 视图的宽度(或高度)必须大于其内容。否则gravity不会有任何效果。因此,wrap_contentgravity在一起毫无意义。
  • 视图的宽度(或高度)必须小于父视图。否则layout_gravity不会有任何效果。因此,match_parentlayout_gravity在一起毫无意义。
  • layout_gravity=center外观一样layout_gravity=center_horizontal,因为他们是在一个垂直线性布局在这里。在这种情况下,您无法垂直居中,因此layout_gravity=center只能水平居中。
  • 该答案仅涉及设置gravitylayout_gravity布局中的视图。若要查看在设置gravity父布局本身的时会发生什么,请查看我上面提到的补充答案。(摘要:gravity不适RelativeLayout用于,但可用于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>

有关


感谢Suragch,在视觉上看到它似乎更容易。
Haritsinh Gohil

466

区别

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

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

HTML / CSS等效项

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

简单的技巧可以帮助您记住

layout-gravity为“糊外引力”。


具有Web开发背景时,它会更有意义。
Haritsinh Gohil

40

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

长话大说:要控制线性布局容器(例如LinearLayout或)中的重力RadioGroup,有两种方法:

1)要控制LinearLayout容器的所有子视图的重力(就像您在书中所做的那样),请在布局XML文件或代码中的方法中使用android:gravity(而不是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_vertical),可以更改为顶部或底部。实际上,默认layout_gravity值为,-1但Android会将其垂直居中。

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

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

实际上,诸如按钮之类的子视图也具有android:gravityXML属性以及setGravity()控制其子视图的方法-其中的文本。将Button.setGravity(int)被链接到这个developer.android.com条目


36

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

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



12

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


8

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


7

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

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

注意:-

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

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

  3. Gravity and Layout-gravity对孩子来说工作更有用FrameLayoutWe can't use Gravity and Layout-gravity在FrameLayout的标记中。

  4. 我们可以在FrameLayoutusing中的任何位置设置Child View layout-gravity

  5. 我们可以使用的FrameLayout内重力的每一个值(例如: - ,center_verticalcenter_horizontalcentertop等),但它是不可能与其他的ViewGroup布局。

  6. FrameLayout全力以赴Layout-gravity。示例:-如果您在工作,FrameLayout无需更改整个布局即可添加新的视图。您只需将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 View和中使用Gravity,而在RelativeLayout View中则无法实现FrameLayout 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>

输出:-

22

方向水平的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>

输出:-

33

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


1
如果textColor全部设置为白色,view那就太好了。:D
Pratik Butani

你确定吗?它将看起来是黑白的,这就是为什么我为每个View使用不同的颜色。
sushildlh

6

一个容易记住的技巧是重力作用在地球内部。因此,android:gravity是为内部视图。

Rememeber的奠定 _gravity这将有助于你要记住,android:layout_gravity要提到外界的看法


5

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

如果您使用的是“ a” LinearLayout,而重力设置却使您发疯(像我一样),请切换到其他位置。

我实际上切换到a,RelativeLayout然后在2个包含s 上使用layout_alignParentLeft,以使它们在一行上向左和向右移动。layout_alignParentRightTextView


4

两者之间的基本区别是:

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

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


3

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

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

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

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


2
我认为不需要新的答案,因为已经发布了多个答案,并且涵盖了几乎相同的内容!
Paresh Mayani 2015年

3

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

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

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

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

重要:(在可用空间内沿X轴移动[override])。

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

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


1

重力用于在视图中设置文本对齐方式,而layout_gravity用于自行设置视图。让我们举个例子,如果要对齐用editText编写的文本,然后使用重力,并且要对齐此editText或任何按钮或任何视图,然后使用layout_gravity,因此非常简单。


1

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

layout_gravity:仅用于当前视图在其相对父视图的上下文中的重力,例如线性Layout或FrameLayout,以使视图居中或位于其父视图的任何其他重力中。


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

0
android:gravity

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

android:layout_gravity 

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


0

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

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


0

重力-适用于自己的视图。

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


0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.