Android中的重力和layout_gravity有什么区别?

我知道我们可以将以下值设置为#0#1属性:

  1. center
  2. center_vertical
  3. center_horizontal等。

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

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

630806 次浏览

他们的名字可以帮助你:

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

一个例子是这里

从我可以收集到的layout_gravity是该视图在其父视图中的重力,重力是该视图中子视图的重力。

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

的区别

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

android:gravity是该视图的里面重力。指定其内容应在哪个方向对齐。

超文本标记语言/CSS等价物

(如果您有Web开发背景)

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

简单的技巧帮助你记住

layout-gravity为“外重力”。

简短回答:使用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 fieldLayoutParams params = (LayoutParams)button.getLayoutParams();params.gravity = Gravity.BOTTOM;button.setLayoutParams(params);

水平的LinearLayout容器,子视图的水平重力依次左对齐,不可更改。android:layout_gravity设置为center_horizontal没有影响。默认垂直重力为中心(或center_vertical),可以更改为顶部或底部。实际上默认的layout_gravity值是-1,但Android将其置于垂直中心。

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

类似地,对于垂直视图组容器,其子视图的垂直重力是上下对齐的,不能更改。默认水平重力是居中(或center_horizontal),可以更改为向左或向右。

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

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

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

如果你使用的是LinearLayout,重力设置让你发疯(像我一样),然后切换到其他东西。

我实际上切换到RelativeLayout,然后在2个包含的TextView上使用layout_alignParentLeftlayout_alignParentRight,让它们在一行上走得最左和最右。

内部-外部

  • gravity排列视图中的内容里面
  • layout_gravity排列视图本身的位置外面

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

在此处输入图片描述

备注

  • layout_gravity不适用于RelativeLayout中的视图。将其用于LinearLayoutFrameLayout中的视图。有关更多详细信息,请参阅我的补充答案
  • 视图的宽度(或高度)必须大于其内容。否则gravity将没有任何影响。因此,wrap_contentgravity在一起是没有意义的。
  • 视图的宽度(或高度)必须小于父视图。否则layout_gravity将没有任何影响。因此,match_parentlayout_gravity在一起没有意义。
  • 这里的layout_gravity=center看起来和layout_gravity=center_horizontal一样,因为它们是垂直的线性布局。在这种情况下你不能垂直居中,所以layout_gravity=center只能水平居中。
  • 此答案仅涉及在布局中的视图上设置gravitylayout_gravity。要了解设置父布局本身的gravity时会发生什么,请查看我上面提到的补充答案。(总结: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" >
<LinearLayoutandroid:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"android:background="#e3e2ad"android:orientation="vertical" >
<TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:textSize="24sp"android:text="gravity=" />
<TextViewandroid:layout_width="200dp"android:layout_height="40dp"android:background="#bcf5b1"android:gravity="left"android:text="left" />
<TextViewandroid:layout_width="200dp"android:layout_height="40dp"android:background="#aacaff"android:gravity="center_horizontal"android:text="center_horizontal" />
<TextViewandroid:layout_width="200dp"android:layout_height="40dp"android:background="#bcf5b1"android:gravity="right"android:text="right" />
<TextViewandroid:layout_width="200dp"android:layout_height="40dp"android:background="#aacaff"android:gravity="center"android:text="center" />
</LinearLayout>
<LinearLayoutandroid:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"android:background="#d6c6cd"android:orientation="vertical" >
<TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:textSize="24sp"android:text="layout_gravity=" />
<TextViewandroid:layout_width="200dp"android:layout_height="40dp"android:layout_gravity="left"android:background="#bcf5b1"android:text="left" />
<TextViewandroid:layout_width="200dp"android:layout_height="40dp"android:layout_gravity="center_horizontal"android:background="#aacaff"android:text="center_horizontal" />
<TextViewandroid:layout_width="200dp"android:layout_height="40dp"android:layout_gravity="right"android:background="#bcf5b1"android:text="right" />
<TextViewandroid:layout_width="200dp"android:layout_height="40dp"android:layout_gravity="center"android:background="#aacaff"android:text="center" />
</LinearLayout>
</LinearLayout>

相关

看图上清楚地心引力

只是想在这里加上我自己的解释——来自iOS的背景,这就是我如何用iOS术语内化两者:

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

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

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

#0是子级可以提供给其父级的属性,以指定其父级中视图的重力。

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

两者的基本区别在于——

android:重力用于视图的子元素。

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

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

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

注:-

  1. 当一些用户有答案时,重力被用于查看内容中,所有ViewGroup Layout都是一样的。

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

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

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

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

  6. FrameLayout完全在Layout-gravity上工作。例子:-如果你在FrameLayout上工作,那么你不需要改变整个Layout来添加新的View。你只需在FrameLayout中最后添加View并给他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">
<TextViewandroid: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"/>
<TextViewandroid: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" />
<TextViewandroid: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"/>
<TextViewandroid: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"/>

<TextViewandroid: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中是不可能的。

线性布局与方向垂直……

注意:-这里我们只能设置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">
<TextViewandroid: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"/>
<TextViewandroid: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"/>

<TextViewandroid: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

线性布局与方向水平……

注意:-这里我们也可以设置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">
<TextViewandroid: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"/>
<TextViewandroid: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"/>

<TextViewandroid: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

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

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

记住lay_gravity中的,这将帮助您记住android:layout_gravity将引用视图中的外面

android:gravity

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

android:layout_gravity

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

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

重力:用于简单的视图,如文本视图、编辑文本等。

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

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

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

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

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

示例:假设你使用LinearLayout(Height:match_parent, Width:match_parent)作为根元素,那么你将有完整的帧空间可用;子视图说2 TextView(Height:wrap_content, Width:wrap_content)在LinearLayout中可以沿着x/y轴移动,使用相应的重力值在父元素上。

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

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

示例:如果你记住前面的例子,我们知道重力使我们能够沿着x/y轴移动,即TextView在LinearLayout中的位置。假设LinearLayout指定了重力:中心;这意味着每个TextView都需要在垂直和水平上居中。现在,如果我们希望其中一个TextView向左/向右移动,我们可以使用TextView上的layout_gravity覆盖指定的重力行为。

奖金:如果你深入挖掘,你会发现TextView中的文本充当子视图;所以如果你在TextView上应用重力,TextView中的文本会四处移动。

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

布局引力---适用于与其父视图相关的视图。

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

重力和layout_gravity都是XML属性。

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

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

有关详细信息,您可以查看此链接