Android上的Gravity和layout_gravity

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

  1. center
  2. center_vertical
  3. center_horizontal

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

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

他们的名字可以帮助你:

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

这里是一个例子。

android:layout_gravity是View的外部重力。 这意味着,指定视图应该触摸它父母的边界的方向。

android:gravity是该视图的内部重力。 这意味着内容应该沿着哪个方向排列。

HTML / CSS等价物:

android:layout_gravity = float在CSS中

android:gravity = text-align in CSS

简单的技巧要记住:把“布局 – 重力”称为“外部重力”

内部 – 外部

  • gravity排列视图的内容。
  • lay out _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是有用的。)

所以请记住, 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> 

有关

  • 视图的填充和边距之间的区别
  • Match_parent与wrap_content
  • 如何以编程方式设置LinearLayout的重力和布局重力

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

长篇小说:为了控制线性布局容器(如LinearLayoutRadioGroup引力,有两种方法:

1)为了控制LinearLayout容器的所有子视图的重力(就像你在书中所做的那样),在layout XML文件中使用android:gravity (而不是android:layout_gravity ),或者在代码中使用setGravity()方法。

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

 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容器,其子视图的水平重力是一个接一个的左alignment,不能改变。 将android:layout_gravity设置为center_horizontal不起作用。 默认的垂直引力是中心(或center_vertical),可以改变为顶部或底部。 其实layout_gravity的默认值是-1但是Android把它垂直居中。

要在水平线性容器中更改子视图的水平位置,可以使用子视图的layout_weight ,margin和padding。

同样,对于垂直View Group容器,其子视图的垂直重力是一个在另一个之上并且不能被改变的。 默认的水平重力是中心(或center_horizontal ),可以左右改变。

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

从我所能收集的内容来看,layout_gravity是这个视图在其父代中的重心,而gravity则是这个视图内部的孩子的重心。

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

看看图像清晰的重力

虽然这个问题已经得到解答,但我还是有一些例子,演示了重力,layout_gravity和layout_weight的使用。

你可以在http://juanpickselov.com/LayoutExamples.zipfind这些例子;

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

如果我们想要在视图内部设置内容的严重性,那么我们将使用“android:gravity”,如果我们想在它的父视图中设置这个视图的重力(作为一个整体),那么我们将使用“android: layout_gravity”。

只是以为我会在这里添加我自己的解释 – 来自iOS的背景,这就是我如何在iOS中内化两者:“布局引力”影响您在超级视图中的位置。 “重力”会影响你的子视图的位置。 换句话说,布局重力把你自己定位在你的孩子的重力位置上。

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

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

我实际上切换到了一个RelativeLayout然后使用layout_alignParentLeftlayout_alignParentRight包含在两个TextView ,让他们在一行上走得很远,离得很远。

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

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

注意:-

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

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

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

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

  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"> <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使用Gravity,这在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> 

输出: –

G2

LinearLayout的方向水平….

注意: – 在这里我们可以设置layout_gravity 3个值( top | 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

注意: – 我们不能在RelativeLayout Views使用layout_gravity ,但是我们可以使用gravity来设置RelativeLayout到相同的位置….

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

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

欲了解更多详情,你可以访问

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

两者的基本区别在于 –

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

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

一个简单的窍门就是重力适用于地球内部的我们。 所以, android:gravity就是视图里面的。

记住在_gravity out这将帮助你记住android:layout_gravity将引用视图

重力用于在视图中设置文本alignment,但是layout_gravity用于自己设置视图。 让我们举个例子,如果你想alignment在editText中编写的文本,然后使用引力,你想alignment这个editText或任何button或任何视图,然后使用layout_gravity,所以它非常简单。

 android:gravity 

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

 android:layout_gravity 

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

引力 :用于像textview,edittext等简单的视图

layout_gravity :用于像线性布局这样的父视图,以使视图位于其父项的中心。

android:gravity – >设置View的使用内容的严重性。

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