【问题标题】:What is the difference between gravity and layout_gravity in Android?Android中的重力和layout_gravity有什么区别?
【发布时间】:2011-03-29 19:19:52
【问题描述】:

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

  1. center
  2. center_vertical
  3. center_horizontal

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

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

【问题讨论】:

标签: android android-layout android-gravity


【解决方案1】:

他们的名字应该对你有所帮助:

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

一个例子是here

【讨论】:

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

Inside - Outside

  • gravity 将内容安排在视图内部
  • lay<strong>out</strong>_gravity 安排视图在其自身外部的位置。

有时看图片也有帮助。绿色和蓝色是TextViews,另外两种背景色是LinearLayouts

注意事项

  • 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。 (总结: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。
【解决方案3】:

区别

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

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

HTML/CSS 等效项

(如果您有网络开发背景)

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

帮助你记住的简单技巧

layout-gravity 视为“外重力”。

【讨论】:

  • 有网络开发背景的更有意义。
【解决方案4】:

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

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

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

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

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

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

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

【讨论】:

    【解决方案5】:

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

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

    【讨论】:

      【解决方案6】:

      看图清楚地心引力

      【讨论】:

        【解决方案7】:

        如果我们想在一个视图中设置内容的重力,那么我们将使用 "android:gravity",如果我们想设置这个视图(作为一个整体)的重力,则使用 in它的父视图然后我们将使用 "android:layout_gravity"

        【讨论】:

          【解决方案8】:

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

          记住 layout_gravity 中的 out,这将帮助您记住 android:layout_gravity 指的是 outside强>观点

          【讨论】:

            【解决方案9】:

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

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

            换句话说,Layout Gravity 定位您自己,而 Gravity 定位您的孩子。

            【讨论】:

              【解决方案10】:

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

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

              注意:-

              1. GravityView Content 中使用,因为某些用户有答案,并且对于所有 ViewGroup Layout 都是相同的。

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

              3. Gravity and Layout-gravityFrameLayout childs 一起工作更有用We can't use Gravity and Layout-gravity 在 FrameLayout 的标签中 ....

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

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

              6. FrameLayout 完全致力于 Layout-gravity。示例:- 如果您在 FrameLayout 上工作,那么您不需要更改整个布局 即可添加新视图。您只需在FrameLayout 中将视图添加作为最后一个,然后给他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>
              

              输出:-

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

              输出:-

              LinearLayout 方向为水平 ....

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

              输出:-

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

              【讨论】:

              • 如果你将textColor全部设置为白色view,那就太好了。 :D
              • 你确定吗?它看起来是黑白的,这就是为什么我为每个视图使用不同的颜色。
              【解决方案11】:

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

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

              我实际上切换到RelativeLayout,然后在包含TextViews 的2 上使用layout_alignParentLeftlayout_alignParentRight 让它们在一条线上向左和最右移动。

              【讨论】:

                【解决方案12】:

                两者的基本区别在于——

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

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

                【讨论】:

                  【解决方案13】:

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

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

                  更多详情您可以访问

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

                  【讨论】:

                  • 我认为不需要新答案,因为已经发布了多个答案并且涵盖了几乎相同的内容!
                  【解决方案14】:

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

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

                  示例: 假设您使用 LinearLayout(高度:match_parent,宽度: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 内的文本会四处移动。 (整个概念也适用于此)

                  【讨论】:

                    【解决方案15】:

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

                    【讨论】:

                      【解决方案16】:

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

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

                      【讨论】:

                      • layout_gravity:仅用于当前视图的相对父级上下文中的重力,而不是其父级内部的其他视图。
                      【解决方案17】:

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

                      【讨论】:

                        【解决方案18】:
                        android:gravity
                        

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

                        android:layout_gravity 
                        

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

                        【讨论】:

                          【解决方案19】:

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

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

                          【讨论】:

                            【解决方案20】:

                            gravity--应用于它自己的视图。

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

                            【讨论】:

                              【解决方案21】:

                              Gravity 和 layout_gravity 都是 XML 属性。

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

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

                              更多详情请看link

                              【讨论】:

                                猜你喜欢
                                • 2012-12-07
                                • 2017-03-17
                                • 2017-10-27
                                • 2012-05-13
                                • 1970-01-01
                                • 1970-01-01
                                • 2017-10-29
                                • 2013-04-02
                                相关资源
                                最近更新 更多