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

时间:2010-08-14 09:28:03

标签: android android-layout android-gravity

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

  1. center
  2. center_vertical
  3. center_horizontal
  4. 但我对这两个问题感到困惑。

    android:gravityandroid:layout_gravity的使用之间有什么区别?

21 个答案:

答案 0 :(得分:1274)

他们的名字可以帮到你:

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

一个例子是here

答案 1 :(得分:479)

Inside - Outside

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

有时看图片也会有所帮助。绿色和蓝色为TextViews,其他两种背景颜色为LinearLayouts

enter image description here

注释

  • layout_gravity不适用于RelativeLayout中的观看次数。将其用于LinearLayoutFrameLayout中的观看次数。有关详细信息,请参阅我的supplemental answer
  • 视图的宽度(或高度)必须大于其内容。否则gravity不会产生任何影响。因此,wrap_contentgravity在一起毫无意义。
  • 视图的宽度(或高度)必须小于父级。否则layout_gravity不会产生任何影响。因此,match_parentlayout_gravity在一起毫无意义。
  • 此处layout_gravity=center看起来与layout_gravity=center_horizontal相同,因为它们处于垂直线性布局中。在这种情况下,您无法垂直居中,因此layout_gravity=center只能水平居中。
  • 此答案仅涉及在布局中的视图上设置gravitylayout_gravity。要查看在设置父布局本身的gravity时会发生什么,请查看我上面提到的supplemental answer。 (摘要:gravityRelativeLayout上效果不佳,但对LinearLayout有用。)

请记住,布局 _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>

相关

答案 2 :(得分:455)

差异

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

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

HTML / CSS等价物

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

帮助您记住的简单技巧

layout-gravity视为“外放重力”。

答案 3 :(得分:38)

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

长篇故事:要控制线性布局容器(例如LinearLayoutRadioGroup)中的重力,有两种方法:

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

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

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(或center_vertical),可以更改为top或bottom。实际上,默认center_horizontal值为layout_gravity,但Android会将其垂直居中。

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

同样,对于垂直视图组容器,其子视图的垂直重力在另一个下方顶部对齐,无法更改。默认的水平重力是中心(或layout_weight),可以更改为左或右。

实际上,子视图(如按钮)还具有center_horizontal XML属性和android:gravity方法来控制其子视图 - 其中的文本。 setGravity()与此developer.android.com entry相关联。

答案 4 :(得分:34)

我可以收集的内容 layout_gravity 是该视图中父视图的重力, gravity 是该视图中子视图的重力。

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

答案 5 :(得分:25)

看图像清楚重力

答案 6 :(得分:13)

虽然问题已经回答,但我有一些示例展示了使用gravity,layout_gravity和layout_weight。

您可以在http://juanpickselov.com/LayoutExamples.zip

找到示例

我在Eclipse中创建了文件,删除了.svn子文件夹,并包含了样式,字符串,颜色等。布局文件是演示的主要内容。由于我是Java和Android开发新手,人们可能会发现Java效率低下。这些文件可以复制到Eclipse Project中,或者我也在Netbeans中使用它们,并为该IDE提供了Android开发插件。

答案 7 :(得分:11)

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

答案 8 :(得分:7)

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

答案 9 :(得分:6)

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

  

FrameLayout .....

中使用重力和布局重力

注意: -

  1. Gravity 查看内容中使用,因为有些用户有回答,并且所有ViewGroup Layout都相同。

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

  3. Gravity and Layout-gravity 工作更有用FrameLayout个孩子一起使用。 FrameLayout的标签中的We can't use Gravity and Layout-gravity ....

  4. 我们可以使用FrameLayout设置子视图layout-gravity中的任何位置。

  5. 我们可以在FrameLayout中使用每一个重力值(例如: - center_verticalcenter_horizontalcentertop等),但它其他ViewGroup布局无法实现。

  6. FrameLayout完全致力于Layout-gravity。示例: - 如果您使用FrameLayout,则不需要更改整个布局以添加新视图。您只需添加查看作为FrameLayout中的最后一个,并为其Layout-gravity提供值。(这是布局重力与FrameLayout 的优势)。

  7.   

    看看例子......

    <?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与上述相同但不同之处在于我们可以在LinearLayout ViewRelativeLayout View中使用重力,这在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>
    

    输出: -

    g2

      

    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>
    

    输出: -

    g3

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

答案 10 :(得分:4)

我在Sandip博客上看到的一些我几乎错过的东西,解决了我的问题。他说layout_gravity不与LinearLayout合作。

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

我实际上切换到RelativeLayout,然后在包含layout_alignParentLeft的2上使用layout_alignParentRightTextView,让他们在一条线上向左和向右走。

答案 11 :(得分:4)

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

记住 out _gravity 中的 out ,这有助于您记住android:layout_gravity会引用外部视图

答案 12 :(得分:2)

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

android:layout_gravity 是孩子可以向其父级提供的归因,用于指定其父级视图的重力。

有关详细信息,请访问

  

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

答案 13 :(得分:2)

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

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

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

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

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

示例:如果你记住上一个例子,我们知道引力使我们沿着x / y轴移动,即; LinearLayout中的TextViews。我们只说LinearLayout指定gravity:center;意味着每个TextView都需要垂直和水平居中。现在,如果我们想要一个TextView向左/向右移动,我们可以使用TextView上的layout_gravity覆盖指定的重力行为。

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

答案 14 :(得分:2)

两者之间的基本区别在于 -

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

相对于父视图,

android:layout_gravity 用于此元素。

答案 15 :(得分:1)

Gravity用于在视图中设置文本对齐,但layout_gravity用于设置自己的视图。让我们举一个例子,如果你想对齐用editText写的文本然后使用gravity,你想要对齐这个editText或任何按钮或任何视图然后使用layout_gravity,所以它非常简单。

答案 16 :(得分:1)

gravity :用于简单视图,如textview,edittext等。

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

答案 17 :(得分:0)

android:gravity

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

"wrap_content"将无法执行任何操作
android:layout_gravity 

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

答案 18 :(得分:0)

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

android:layout_gravity - &gt;设置它的父视图或布局

的重力

答案 19 :(得分:0)

重力-适用于其自身视图。

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

答案 20 :(得分:0)

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