我知道我们可以为android设置以下值:gravity和android:layout_gravity财产:
居中中心_垂直center_horizontal等。
但我对这两者都感到困惑。
android:gravity和android:layout_gravity的用法有什么区别?
我知道我们可以为android设置以下值:gravity和android:layout_gravity财产:
居中中心_垂直center_horizontal等。
但我对这两者都感到困惑。
android:gravity和android:layout_gravity的用法有什么区别?
他们的名字可以帮助您:
android:gravity设置其使用的视图的内容(即其子视图)的重力。android:layout_gravity设置视图或布局相对于其父对象的重力。
这里有一个例子。
不同之处在于
android:layout_gravity是视图的外部重力。指定视图应接触其父对象边界的方向。
android:重力是该视图的内部重力。指定其内容应对齐的方向。
HTML/CSS等价物
(如果您来自web开发背景)
Android | CSS
————————————————————————+————————————
android:layout_gravity | float
android:gravity | text-align
帮助你记住的简单技巧
将布局重力作为“外部重力”。
简短回答:使用android:gravity或setGravity()控制容器所有子视图的重力;使用android:layout_gravity或setLayoutParams()控制容器中单个视图的重力。
长话短说:要控制线性布局容器(如LinearLayout或RadioGroup)中的重力,有两种方法:
要控制LinearLayout容器的所有子视图的重力(正如您在书中所做的那样),请在布局XML文件中使用android:gravity(而不是android:layout_gravity)或代码中使用setGravity()方法。要控制子视图在其容器中的重力,请使用android:layout_gravity XML属性。在代码中,需要获取视图的LinearLayout.LayoutParams并设置其重力。下面是一个代码示例,它在水平方向的容器中将按钮设置为底部:import android.widget.LinearLayout.LayoutParams;import android.view.Gravity;...Button Button=(Button)findViewById(R.id.MyButtonId);//需要转换为LinearLayout.LayoutParams才能访问重力场LayoutParams params=(LayoutParams)按钮.getLayoutParams();params.gravity=重力.BOTTOM;button.setLayoutParams(params);
对于水平LinearLayout容器,其子视图的水平重力一个接一个地左对齐,不能更改。将android:layout_gravity设置为center_horizontal没有效果。默认垂直重力为中心(或center_vertical),可以更改为顶部或底部。实际上,默认layout_gravity值为-1,但Android将其垂直居中。
要更改水平线性容器中子视图的水平位置,可以使用子视图的layout_weight、margin和padding。
同样,对于垂直视图组容器,其子视图的垂直重力是上下对齐的,不能更改。默认水平重力为center(或center_horizontal),可以更改为向左或向右。
实际上,像按钮这样的子视图还具有android:gravity XML属性和setGravity()方法来控制其子视图——其中的文本。button.setGravity(int)链接到此developer.android.com条目。
如果我们想设置视图中内容的重力,那么我们将使用“android:gravity”,如果我们想在父视图中设置此视图(作为一个整体)的重力,则我们将使用”android:layout_gravity“。
我在Sandip的博客上看到了一些我差点错过的东西,解决了我的问题。他说layout_gravity不适用于LinearLayout。
如果你使用的是LinearLayout,而重力设置让你发疯(像我一样),那么就切换到其他设置。
我实际上切换到了RelativeLayout,然后在2个包含的TextView上使用layout_alignParentLeft和layout_aignParentRight,使它们在一行上向左和向右移动。
内部-外部
重力在视图内排列内容。layout_gravity将视图的位置安排在其自身之外。
有时看照片也会有帮助。绿色和蓝色是文本视图,其他两种背景色是LinearLayouts。
笔记
layout_gravity不适用于RelativeLayout中的视图。用于LinearLayout或FrameLayout中的视图。有关更多详细信息,请参阅我的补充答案。视图的宽度(或高度)必须大于其内容。否则重力不会有任何影响。因此,包裹和重力在一起是没有意义的。视图的宽度(或高度)必须小于父视图。否则layout_gravity不会有任何影响。因此,match_parent和layout_gravity在一起没有意义。layout_gravity=center与此处的layout_ggravity=center_horizontal看起来相同,因为它们是垂直线性布局。在这种情况下,不能垂直居中,因此layout_gravity=仅水平居中。这个答案只涉及在布局中的视图上设置重力和layout_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>
相关的
视图填充和边距之间的差异匹配_租用vs包装_内容如何编程设置LinearLayout的重力和布局重力
我只是想在这里添加我自己的解释-来自iOS的背景,这是我如何在iOS术语中内化两者的:
布局重力会影响您在超级视图中的位置。重力会影响子视图在您体内的位置。
另一种说法是,布局重力定位你自己,而重力定位你的孩子。
android:gravity用于指定如何将对象的内容放置在对象本身中。换句话说,android:gravity用于指定视图内容的重力。
android:layoutgravity是孩子可以提供给父母的属性,用于指定父母内部视图的重力。
有关详细信息,请访问
http://developer.android.com/reference/android/widget/LinearLayout.LayoutParams.html
重力和布局重力有很多不同。我将解释我关于这两个概念的经验(我的观察和一些网站获得的所有信息)。
在FrameLayout中使用重力和布局重力。。。。。
注:-
重力在“视图内容”中使用,因为某些用户有答案,并且对于所有“视图组布局”也是如此。布局重力与父视图一起使用,因为某些用户有答案。重力和布局重力对于FrameLayout子对象更有用。我们不能在FrameLayout的标记中使用重力和布局重力。。。。我们可以使用布局重力在FrameLayout中的任何位置设置“子视图”。我们可以使用FrameLayout中的每一个重力值(例如:-center_vertical、center_horizontal、center、top等),但其他ViewGroup Layout无法使用。FrameLayout完全适用于布局重力。示例:-如果您使用FrameLayout,则无需更改整个布局以添加新视图。您只需将视图添加为FrameLayout中的最后一个,并为其提供具有值的布局重力。(这是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中重力和布局重力的使用。。。。。
重力的工作方式与上述相同,但这里的不同之处在于,我们可以在LinearLayout视图和RelativeLayout视图中使用重力,这在FrameLayout视图中是不可能的。
方向垂直的LinearLayout。。。。
注意:这里我们只能设置layout_gravity的三个值,即(左|右|中(也称为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的三个值,即(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>
输出:-
注意:-我们不能在RelativeLayout视图中使用layout_gravity,但我们可以使用重力将RelativeLlayout子对象设置为相同的位置。。。。
记住这一点的一个简单技巧是,地心引力适用于地球内部的我们。所以,安卓:重力是指内部视图。
记住layout_gravity中的out,这将帮助您记住android:layout_ggravity将指视图外部
android:gravity
用于调整视图相对于其指定位置(分配区域)的内容。如果layout_width等于“wrap_content”,android:gravity=“left”将不会执行任何操作
android:layout_gravity
用于相对于父文件或布局文件的视图本身。
重力用于设置视图中的文本对齐方式,但layout_Gravity用于设置视图本身。举个例子,如果你想对齐editText中的文本,然后使用重力,你想对齐这个editText或任何按钮或任何视图,然后使用layout_gravity,所以非常简单。
gravity:用于文本视图、编辑文本等简单视图。
layout_gravity:用于当前视图在其相对父视图(如linear layout或FrameLayout)的上下文中的重力,以使视图位于父视图的中心或任何其他重力。
重力:允许您移动容器内的内容。(如何放置子视图)。
重要提示:(在可用空间内沿X轴或Y轴移动)。
示例:假设您要使用LinearLayout(Height:match_parent,Width:match_parent)作为根级元素,那么您将拥有完整的帧空间;并且子视图表示LinearLayout内的2个文本视图(Height:wrap_content,Width:wrap-content)可以使用父视图上的重力值沿x/y轴移动。
Layout_Gravity:允许您仅沿x轴覆盖父重力行为。
重要提示:(在可用空间内沿X轴移动[覆盖])。
示例:如果您记住前面的示例,我们知道重力使我们能够沿着x/y轴移动,即:;将TextViews放置在LinearLayout中。让我们假设LinearLayout指定重力:中心;这意味着每个TextView都需要垂直和水平居中。现在,如果我们希望其中一个TextView向左/向右移动,我们可以使用TextView上的layout_gravity覆盖指定的重力行为。
另外:如果你深入挖掘,你会发现TextView中的文本充当子视图;因此,如果在TextView上应用重力,TextView内的文本将四处移动。(整个概念也适用于此)
Gravity和layout_Gravity都是XML属性。
android:gravity属性用于排列视图中内容的位置(例如Button小部件中的文本)。
android:layout_gravity用于安排整个视图相对于其容器的位置。
有关详细信息,请参阅此链接。