提问



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



  1. center

  2. center_vertical

  3. center_horizontal等。



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


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

最佳参考


他们的名字可以帮助你:



  • android:gravity设置View使用的内容的重力(即它的子视图)。

  • android:layout_gravity设定ViewLayout相对于其父项的重力。



这里有一个例子。[122]

其它参考1


差异



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


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


HTML/CSS等价物



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


帮助您记住的简单技巧



layout-gravity设为Lay-outside-gravity。

其它参考2


内部 - 外部



  • gravity将内容安排在视图中。

  • layout_gravity安排视图的位置在之外。



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


[124]


注释




  • layout_gravity不适用于RelativeLayout中的观点。将其用于LinearLayoutFrameLayout中的视图。有关详细信息,请参阅我的补充答案。

  • 视图的宽度(或高度)必须大于其内容。否则gravity不会有任何影响。因此,wrap_contentgravity在一起毫无意义。

  • 视图的宽度(或高度)必须小于父级。否则layout_gravity不会有任何影响。因此,match_parentlayout_gravity在一起毫无意义。

  • layout_gravity=centerlayout_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" >

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


相关




  • 视图的填充和边距之间的差异

  • Match_parent vs wrap_content

  • 如何以编程方式设置LinearLayout的重力和布局重力


其它参考3


简答:使用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,边距和填充。


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


实际上,诸如按钮之类的子视图也具有android:gravity XML属性和setGravity()方法来控制其子视图 - 其中的文本。 Button.setGravity(int)链接到此developer.android.com条目。[130]

其它参考4


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


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

其它参考5





看图像清楚重力

其它参考6


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


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


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

其它参考7


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

其它参考8


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

其它参考9


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


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


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

其它参考10


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



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



注意: -



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

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

  3. Gravity and Layout-gravityFrameLayout工作更有用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>


输出: -


[132]



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


输出: -


[133]



  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>


输出: -


[134]


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

其它参考11


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


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


有关详细信息,请访问



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


其它参考12


两者的基本区别在于─


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


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

其它参考13


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


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

其它参考14


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

其它参考15


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


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

其它参考16


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


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


示例:如果您使用LinearLayout(Height:match_parent,Width:match_parent)作为根级元素,那么您可以使用完整的框架空间;并且子视图显示2 TextViews LinearLayout内的(高度: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内的文本将会四处移动。 (整个概念也适用于此)

其它参考17


android:gravity


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


android:layout_gravity 


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

其它参考18


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


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