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

Par*_*ani 1286 android android-layout android-gravity

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

  1. center
  2. center_vertical
  3. center_horizontal

但我对这两个问题感到困惑.

使用android:gravity和有android:layout_gravity什么区别?

Sep*_*phy 1313

他们的名字可以帮助你:

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

而一个例子是在这里.

  • 基本上,`layout_`的所有内容都定义了影响外部元素的东西. (83认同)
  • 看,我发现这很有趣,因为如果我只是取消名字,我的直觉就是另一种方式.每次,我认为"layout_gravity"意味着"这个ViewGroup如何设置它的内容的重力",而"gravity"则是"这个视图所倾向的地方". (27认同)
  • 那么如果`android:gravity`设置为left并且其子项的`android:layout_gravity`设置为正确会发生什么?孩子们哪一方对齐? (14认同)
  • 正如@Suragch评论他的回答,layout_gravity仅适用于LinearLayout和FrameLayout.但是LinearLayout对它有约束. (2认同)

Sur*_*gch 498

内 - 外

  • gravity安排视图的内容.
  • layout_gravity安排视图自身之外的位置.

有时候看图片也会有所帮助.绿色和蓝色是TextViews和其他两种背景颜色LinearLayouts.

在此输入图像描述

笔记

  • layout_gravity对于a中的视图不起作用RelativeLayout.将它用于LinearLayout或中的视图FrameLayout.有关详细信息,请参阅我的补充答案.
  • 视图的宽度(或高度)必须大于其内容.否则gravity不会有任何影响.因此,wrap_content并且gravity在一起是没有意义的.
  • 视图的宽度(或高度)必须小于父级.否则layout_gravity不会有任何影响.因此,match_parent并且layout_gravity在一起是没有意义的.
  • layout_gravity=center外观一样layout_gravity=center_horizontal,因为他们是在一个垂直线性布局在这里.在这种情况下,您不能垂直居中,因此layout_gravity=center只能水平居中.
  • 这个答案只涉及布局中的设置gravitylayout_gravity视图.要查看设置gravity父布局本身时会发生什么,请查看我上面提到的补充答案.(摘要:gravity在a上效果不好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>
Run Code Online (Sandbox Code Playgroud)

有关

  • 视觉上看起来更容易,谢谢Suragch。 (2认同)

Vis*_*das 460

区别

android:layout_gravity是观点的外部引力.指定视图应触及其父边框的方向.

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

HTML/CSS等价物

Android                 | CSS
————————————————————————+————————————
android:layout_gravity  | float
android:gravity         | text-align
Run Code Online (Sandbox Code Playgroud)

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

采取layout-gravity"外部重力".


Yin*_*ing 38

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

长篇小说:要控制线性布局容器中的重力,LinearLayout或者RadioGroup,有两种方法:

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

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);
Run Code Online (Sandbox Code Playgroud)

对于水平LinearLayout容器,其子视图的水平重力一个接一个地左对齐,不能更改.设置android:layout_gravitycenter_horizontal无效.默认的垂直重力是center(或center_vertical),可以更改为top或bottom.实际上默认layout_gravity值是,-1但Android将其垂直居中.

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

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

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


mat*_*990 35

从我可以收集的内容中,layout_gravity是其父级内部视图的重力,而gravity是该视图中子级的重力.

我认为这是对的,但最好的方法就是玩弄.


Aks*_*wal 26

看图像清楚重力


小智 13

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

您可以在http://juanpickselov.com/LayoutExamples.zip上找到示例

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

  • 不知何故,两年半之后,示例链接产生了404. (3认同)

小智 11

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


Mah*_*iya 9

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

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


msz*_*aro 7

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


sus*_*dlh 6

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

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

注意:-

  1. 视图内容中使用重力,因为一些用户有答案,并且所有人都一样ViewGroup Layout.

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

  3. Gravity and Layout-gravity工作更有用FrameLayout孩子的.We can't use Gravity and Layout-gravity在FrameLayout的标签....

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

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

  6. FrameLayout全力以赴Layout-gravity.示例: - 如果您处理,FrameLayout无需更改整个布局以添加新视图.你只需添加View作为最后一个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>
Run Code Online (Sandbox Code Playgroud)

输出: -

G1

在LinearLayout中使用重力和布局引力.....

Gravity工作与上面相同,但这里differnce是,我们可以利用重力里面LinearLayout ViewRelativeLayout View这是不可能的FrameLayout View.

LinearLayout,方向垂直....

注意: - 这里我们只能设置3个值layout_gravity(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>
Run Code Online (Sandbox Code Playgroud)

输出: -

G2

LinearLayout,方向水平....

注意: - 这里我们也可以设置3个值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>
Run Code Online (Sandbox Code Playgroud)

输出: -

G3

注: -我们不能用layout_gravityRelativeLayout Views,但我们可以用gravity设置RelativeLayout孩子的,以相同的位置....

  • 如果将所有“view”中的“textColor”设置为白色,那就太好了。:D (2认同)

Jus*_*Guy 5

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

如果你正在使用 aLinearLayout并且重力设置让你发疯(像我一样),那么切换到别的东西。

我实际上切换到了一个RelativeLayoutthen used layout_alignParentLeftand layout_alignParentRighton the 2 contains TextViews 让它们在一条线上去最左边和最右边。