Android上的Gravity和layout_gravity
我知道我们可以将以下值设置为android:gravity
和android:layout_gravity
属性:
-
center
-
center_vertical
-
center_horizontal
等
但是我对这两个都感到困惑。
android:gravity
和android:layout_gravity
的用法有什么区别?
他们的名字可以帮助你:
-
android:gravity
设置View
的使用内容(即它的子视图)的严重性。 -
android:layout_gravity
设置View
或Layout
相对于其父的重力。
这里是一个例子。
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
视图。 用于LinearLayout
或FrameLayout
视图。 看到我的补充答案更多的细节。 - 视图的宽度(或高度)必须大于其内容。 否则
gravity
不会有任何影响。 因此,wrap_content
和gravity
是没有意义的。 - 视图的宽度(或高度)必须小于父级。 否则
layout_gravity
不会有任何效果。 因此,match_parent
和layout_gravity
在一起是没有意义的。 -
layout_gravity=center
看起来与layout_gravity=center_horizontal
相同,因为它们处于垂直线性布局。 在这种情况下,你不能垂直居中,所以layout_gravity=center
只能水平居中。 - 这个答案只处理布局中的视图的
gravity
和layout_gravity
。 要查看在设置父布局本身的gravity
时发生的情况,请查看上面提到的补充答案 。 (总结:gravity
在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>
有关
- 视图的填充和边距之间的区别
- Match_parent与wrap_content
- 如何以编程方式设置LinearLayout的重力和布局重力
简短答案:使用android:gravity
或setGravity()
来控制容器的所有子视图的重力; 使用android:layout_gravity
或setLayoutParams()
来控制容器中单个视图的重力。
长篇小说:为了控制线性布局容器(如LinearLayout
或RadioGroup
引力,有两种方法:
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_alignParentLeft
和layout_alignParentRight
包含在两个TextView
,让他们在一行上走得很远,离得很远。
gravity
和layout-gravity
有很多不同之处。 我将解释我关于这两个概念的经验( 由于我的观察和一些网站而得到的所有信息 )。
在
FrameLayout
使用重力和布局重力…..
注意:-
-
重力在视图内容中使用,因为有些用户有答案,所有
ViewGroup Layout
都是一样的。 -
Layout-gravity
与父视图一起使用,因为某些用户有答案。 -
Gravity and Layout-gravity
是FrameLayout
孩子更有用的工作 。We can't use Gravity and Layout-gravity
在FrameLayout的标签中We can't use Gravity and Layout-gravity
…. -
我们可以使用
layout-gravity
将子视图设置在FrameLayout
任何位置。 -
我们可以在FrameLayout中使用每一个重力值(例如: –
center_vertical
,center_horizontal
,center
,top
等),但其他ViewGroup布局是不可能的。 -
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>
输出: –
在LinearLayout中使用重力和布局重力…..
Gravity
工作方式与上面的相同,但不同之处在于我们可以在LinearLayout View
和RelativeLayout 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>
输出: –
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>
输出: –
注意: – 我们不能在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
– >设置父视图或布局的重力
- 在Android中以编程方式删除背景绘制
- Android:在ExpandableListView中隐藏子分隔符
- 如何使用gradle为所有模块定义常见的android属性
- 如何以编程方式创buildProgressBar?
- Android:如何将微调器绑定到自定义对象列表?
- 如何在使用ViewPager时在ActionBarActivity Fragments中处理AsyncTask?
- 实例化新的Android Fragment的最佳做法
- Android Gradle Project将构build工具升级到21.0.1:aapt抛出exception
- 查找Android应用的软件包名称以使用Intent从Web启动Market应用